顺序栈SqStack

基本操作

 Status InitStack()//构造一个空栈S
Status DestroyStack()//销毁栈S,S不再存在
Status ClearStack()//把S置为空栈
Status StackEmpty()//若S为空栈,则返回true,否则返回false
int StackLength()//返回S的元素个数,即栈的长度
Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
Status Push(SElemType e)//插入元素e为新的栈顶元素
Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败

几个小程序(代码正误检验,数制转换,括号匹配检验,行编辑程序)

 CheckStackCode();//测试Stack代码正确性
Conversion();//数制转换
BracketsMatching();//括号匹配的检验
LineEdit();//行编辑程序
 //
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define N 104 using namespace std;
typedef long long LL;
/*
double anss;
LL aans,sum;
int cas,cass;
int n,m,lll,ans;
*/ const int OK=;
const int ERROR=;
const int INFEASIBLE=-;
const int STACK_INIT_SIZE=;//存储空间初始分配量
const int STACKINCREMENT=;//存储空间分配增量
typedef int Status;
typedef int SElemType; Status OutputInt(SElemType e);
Status OutputChar(SElemType e);
typedef struct
{
SElemType *base;//栈构造之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位 Status InitStack()//构造一个空栈S
{
base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!base)exit(OVERFLOW);//存储分配失败
top=base;
stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack Status DestroyStack()//销毁栈S,S不再存在
{
free(base);
base=NULL;
top=NULL;
stacksize=;
return OK;
}//DestroyStack Status ClearStack()//把S置为空栈
{
top=base;
return OK;
}//ClearStack Status StackEmpty()//若S为空栈,则返回true,否则返回false
{
if(top==base)return true;
return false;
}//StackEmpty int StackLength()//返回S的元素个数,即栈的长度
{
return top-base;
}//StackLength Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
{
if(top==base)return ERROR;
e=*(top-);
return OK;
}//GetTop Status Push(SElemType e)//插入元素e为新的栈顶元素
{
if(top-base>=stacksize)//栈满,追加存储空间
{
base=(SElemType *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!base)exit(OVERFLOW);//存储分配失败
top=base+stacksize;
stacksize+=STACKINCREMENT;
}
(*top++)=e;
return OK;
}//Push Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
{
if(top==base)return ERROR;
e=(*--top);
return OK;
}//Pop Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败
{
SElemType *i=base;
Status (*visit)(SElemType);
if(p==)visit=OutputInt;
else if(p==)visit=OutputChar;
while(top>i)
visit(*i++);
puts("");
return OK;
}//StackTraverse
}SqStack; Status OutputInt(SElemType e)
{
printf("%d ",e);
return OK;
}
Status OutputChar(SElemType e)
{
printf("%c",e);
return OK;
} void CheckStackCode()
{
typedef int SElemType;
int i;
SqStack S;
SElemType e;
if(S.InitStack()==OK)
{
for(i=;i<=;i++)
S.Push(i);
}
printf("栈中元素依次为:");
S.StackTraverse();
S.Pop(e);
printf("弹出的栈顶元素 e=%d\n",e);
printf("栈空否:%d(1:空 0:否)\n",S.StackEmpty());
S.GetTop(e);
printf("栈顶元素 e=%d 栈的长度为%d\n",e,S.StackLength());
S.Push();
printf("栈中元素依次为:");
S.StackTraverse();
S.GetTop(e);
printf("栈顶元素 e=%d 栈的长度为%d\n",e,S.StackLength());
S.DestroyStack();
printf("销毁栈后,S.top=%d S.base=%d S.stacksize=%d\n",S.top,S.base,S.stacksize);
} void Conversion()//对于输入的任意一个非负十进制整数n,打印输出与其等值的八进制数
{
typedef int SElemType;
int n;
SqStack S;
SElemType e; S.InitStack();//构造空栈
scanf("%d",&n);
while(n)
{
S.Push(n%);
n/=;
}
while(!S.StackEmpty())
{
S.Pop(e);
printf("%d",e);
}
puts(""); S.DestroyStack();
} void BracketsMatching()//三种括号()[]{},检验是否合法
{ char s[N];
SqStack S;
SElemType e;
int i;
S.InitStack();
scanf("%s",s); for(i=;i<strlen(s);i++)
{
if(s[i]=='(' || s[i]=='{' || s[i]=='[')
S.Push(s[i]);
else if(s[i]==')' || s[i]=='}' || s[i]==']')
{
if(S.GetTop(e) && ((e=='(' && s[i]==')') || (e=='[' && s[i]==']') || (e=='{' && s[i]=='}')))
S.Pop(e);
else
{
puts("NO");
S.DestroyStack();
return;
}
}
}
if(S.StackEmpty())puts("YES");
else puts("NO");
S.DestroyStack();
} void LineEdit()//从终端接收一行并传送至调用过程的数据区,#为退格符,@为退行符
{
int i;
char ch;
SqStack S;
SElemType e;
S.InitStack();
while(ch!=EOF)
{
for(ch=getchar();ch!=EOF && ch!='\n';ch=getchar())
{
if(ch=='#')S.Pop(e);
else if(ch=='@')S.ClearStack();
else S.Push(ch);
}
S.StackTraverse();
S.ClearStack();
}
S.DestroyStack();
} int main()
{
#ifndef ONLINE_JUDGEW
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
// init();
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
/*
while(~scanf("%d%d",&n,&m))
{ }
*/ CheckStackCode();//测试Stack代码正确性 Conversion();//数制转换 BracketsMatching();//括号匹配的检验 LineEdit();//行编辑程序 return ;
}
/*
// //
*/

马踏棋盘问题(NxN)

暴力(顺序栈实现)

 //
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define N 8
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
LL n,m,lll,ans;
int a[N][N];
bool u[N][N];
int dx[]={-,-,,,,,-,-};
int dy[]={,,,,-,-,-,-}; const int OK=;
const int ERROR=;
const int INFEASIBLE=-;
const int STACK_INIT_SIZE=;//存储空间初始分配量
const int STACKINCREMENT=;//存储空间分配增量
typedef int Status; typedef struct
{
int x,y,dir;
}SElemType; Status OutputInt(SElemType e);
Status OutputChar(SElemType e);
typedef struct
{
SElemType *base;//栈构造之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已分配的存储空间,以元素为单位 Status InitStack()//构造一个空栈S
{
base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!base)exit(OVERFLOW);//存储分配失败
top=base;
stacksize=STACK_INIT_SIZE;
return OK;
}//InitStack Status DestroyStack()//销毁栈S,S不再存在
{
free(base);
base=NULL;
top=NULL;
stacksize=;
return OK;
}//DestroyStack Status ClearStack()//把S置为空栈
{
top=base;
return OK;
}//ClearStack Status StackEmpty()//若S为空栈,则返回true,否则返回false
{
if(top==base)return true;
return false;
}//StackEmpty int StackLength()//返回S的元素个数,即栈的长度
{
return top-base;
}//StackLength Status GetTop(SElemType &e)//若栈不空,则用e返回S的栈顶元素,并返回OK,否则返回ERROR
{
if(top==base)return ERROR;
e=*(top-);
return OK;
}//GetTop Status Push(SElemType e)//插入元素e为新的栈顶元素
{
if(top-base>=stacksize)//栈满,追加存储空间
{
base=(SElemType *)realloc(base,(stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!base)exit(OVERFLOW);//存储分配失败
top=base+stacksize;
stacksize+=STACKINCREMENT;
}
(*top++)=e;
return OK;
}//Push Status Pop(SElemType &e)//若栈不空,则删除S的栈顶元素,并用e返回其值,并返回OK,否则返回ERROR
{
if(top==base)return ERROR;
e=(*--top);
return OK;
}//Pop Status StackTraverse(int p)//从栈底到栈顶依次对栈中每个元素调用函数visit().一旦visit()失败则操作失败
{
SElemType *i=base;
Status (*visit)(SElemType);
if(p==)visit=OutputInt;
else if(p==)visit=OutputChar;
while(top>i)
visit(*i++);
puts("");
return OK;
}//StackTraverse
}SqStack;
Status OutputInt(SElemType e)
{
printf("%d ",e);
return OK;
}
Status OutputChar(SElemType e)
{
printf("%c",e);
return OK;
} SqStack S;
void print()
{
int i,j;
for(i=;i<N;i++,puts(""))
for(j=;j<N;j++)
printf("%d ",a[i][j]);
puts("");
}
int main()
{
#ifndef ONLINE_JUDGEW
freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z,xx,yy;
// init();
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
while(~scanf("%d%d",&n,&m))
{
mem(a,);mem(u,);
S.InitStack();
SElemType e,to;
e.x=n,e.y=m,e.dir=-;
u[n][m]=;
S.Push(e);
loop : while(S.top-S.base<N*N && !S.StackEmpty())
{
SElemType & now=*(S.top-);
for(++now.dir;now.dir<;now.dir++)
{
xx=now.x+dx[now.dir],yy=now.y+dy[now.dir];
if(xx>= && xx<N && yy>= && yy<N && !u[xx][yy])
{
u[xx][yy]=;
to.x=xx,to.y=yy,to.dir=-;
S.Push(to);
goto loop;
}
}
S.Pop(e);
u[e.x][e.y]=;
}
if(S.StackEmpty()){puts("No Answer\n");continue;}
SElemType *id;
for(id=S.base,cas=;id!=S.top;id++)
{
e=(*id);
a[e.x][e.y]=++cas;
}
print();
S.DestroyStack();
}
return ;
}

马踏棋盘贪心优化

 //
//by coolxxx
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<stack>
#include<queue>
#include<set>
#include<bitset>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) ((a)*(a))
#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))
#define mem(a,b) memset(a,b,sizeof(a))
#define eps (1e-10)
#define J 10000
#define mod 1000000007
#define MAX 0x7f7f7f7f
#define PI 3.14159265358979323
#pragma comment(linker,"/STACK:1024000000,1024000000")
#define N 8
using namespace std;
typedef long long LL;
double anss;
LL aans;
int cas,cass;
LL n,m,lll,ans;
int a[N][N];
bool u[N][N];
int dx[]={-,-,,,,,-,-};
int dy[]={,,,,-,-,-,-};
struct xxx
{
int c,num;
};
bool cmp(xxx aa,xxx bb)
{
return aa.c<bb.c;
}
void print()
{
int i,j;
for(i=;i<N;i++,puts(""))
for(j=;j<N;j++)
printf("%d ",a[i][j]);
puts("");
}
void cal(int x,int y,xxx d[])
{
int i,j,xx,yy,x1,y1;
for(i=;i<;i++)
{
d[i].c=;d[i].num=i;
xx=x+dx[i],yy=y+dy[i];
if(xx>= && xx<N && yy>= && yy<N && !u[xx][yy])
{
d[i].c++;
for(j=;j<;j++)
{
x1=xx+dx[j],y1=yy+dy[j];
if(x1>= && x1<N && y1>= && y1<N && !u[x1][y1])
{
d[i].c++;
}
}
}
}
}
void dfs(int x,int y,int top)
{
if(top==)
{
print();
lll++;
return;
}
int i,j,xx,yy;
xxx d[];
cal(x,y,d);
sort(d,d+,cmp);
for(i=;i<;i++)
{
if(d[i].c==)continue;
j=d[i].num;
xx=x+dx[j],yy=y+dy[j];
if(xx>= && xx<N && yy>= && yy<N && !u[xx][yy])
{
u[xx][yy]=;
a[xx][yy]=top;
dfs(xx,yy,top+);
if(lll==cas)return;
u[xx][yy]=;
a[xx][yy]=;
}
}
}
int main()
{
#ifndef ONLINE_JUDGEW
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,k;
int x,y,z,xx,yy;
// init();
// for(scanf("%d",&cass);cass;cass--)
// for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
// while(~scanf("%s",s))
puts("输入起点坐标和需要的解的数量");
while(~scanf("%d%d",&n,&m))
{
scanf("%d",&cas);
j=clock();
mem(a,);mem(u,);lll=;
a[n][m]=;u[n][m]=;
dfs(n,m,);
k=clock();
printf("用时 %.3lf s\n",0.001*(k-j));
puts("输入起点坐标和需要的解的数量");
}
return ;
}

为了写的快就随便优化没怎么细想,如果觉得我的算法复杂度还是太高可以转http://blog.csdn.net/bone_ace/article/details/41579957

数据结构之顺序栈SqStack的更多相关文章

  1. 数据结构:C_顺序栈的实现

    数据结构顺序栈的实现(C语言版) 1.写在前面 栈是一种遵循元素先进(Push)后出(Pop)规则的线性表,它的实现可以用数组或者链表. ..... 2.代码分解 2.1对栈的结构定义: typede ...

  2. 顺序栈操作--数据结构(C++)版

    最近学习数据结构,一开始接触感觉好难,颓废了一段时间,后来又重新翻开学习,突然感觉到很大的兴趣.对这些代码的运用都有了 一些新的认识.下面简单的讲述下最新学到的顺序栈,不知道大家学习的时候会不会有感觉 ...

  3. 数据结构Java实现05----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  4. TOJ 数据结构实验--静态顺序栈

    描述 创建一个顺序栈(静态),栈大小为5.能够完成栈的初始化.入栈.出栈.获取栈顶元素.销毁栈等操作. 顺序栈类型定义如下: typedef struct {  int data[Max];    i ...

  5. 数据结构Java实现03----栈:顺序栈和链式堆栈

    一.堆栈的基本概念: 堆栈(也简称作栈)是一种特殊的线性表,堆栈的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置进行插入和删除操作,而堆栈只允许在固定一端进行插入和删除 ...

  6. 利用顺序栈解决括号匹配问题(c++)-- 数据结构

    题目: 7-1 括号匹配 (30 分)   给定一串字符,不超过100个字符,可能包括括号.数字.字母.标点符号.空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配. 输入格式: 输入在一行 ...

  7. 【C#】【数据结构】005-栈:顺序栈

    C#数据结构:顺序栈 1.自定义顺序栈结构: /// <summary> /// 顺序栈 /// </summary> /// <typeparam name=" ...

  8. 数据结构 - 顺序栈的实行(C语言)

    数据结构-顺序栈的实现 1 顺序栈的定义 既然栈是线性表的特例,那么栈的顺序存储其实也是线性表顺序存储的简化,我们简称为顺序栈.线性表是用数组来实现的,对于栈这种只能一头插入删除的线性表来说,用数组哪 ...

  9. 数据结构(C实现)------- 顺序栈

    栈是限定仅在表的一端进行插入或删除的纯属表,通常称同意插入.删除的一端为栈顶(Top),对应在的.则称还有一端为栈底(Bottom). 不含元素的栈则称为空栈. 所设栈S={a1,a2,a3,..., ...

随机推荐

  1. 谁是谁的first-child

    看过CSS伪类选择器之后,心想也就如此嘛,:first-child选择元素的第一个子元素,有什么难的,可一到实践中,还是到处碰壁啊. <body> <ul class="f ...

  2. WPF RichTextBox 如何滚动到光标所在位置、滚动条操作

    1.获取当前滚动条位置 //获取当前滚动条位置 richTextBox.VerticalOffset; richTextBox.HorizontalOffset; //获取当前光标位置 richTex ...

  3. 实现Android K的伪沉浸式

    在Android 5.0之后引入了MD风格,从而状态栏沉浸也成为了一种设计习惯.而停留在之Android L之前的Android系统则不能直接实现沉浸式,这里就介绍一下如何实现Android K系列的 ...

  4. 我的C# - Web - DAL- DBHelper.cs

    其中的部分内容是别人的,我修改过了并加入了详细的注释!!! 一.这个DBHelper的大致块儿如下图: 二.下面是具体的源代码: //命名空间..... using System;using Syst ...

  5. SQLite 入门教程(四)增删改查,有讲究

    增删改查操作,其中增删改操作被称为数据操作语言 DML,相对来说简单一点. 查操作相对来说复杂一点,涉及到很多子句,所以这篇先讲增删改操作,以例子为主,后面再讲查操作. 一.插入数据 INSERT I ...

  6. ExtJs4 学习3 combox自动加载的例子

    Ext.onReady(function() {   delivery_datas = [{ "Id" : "1", "Name" : &q ...

  7. (转载)css垂直水平居中的整理

    方法一 .demo1 { width:180px; height:180px; line-height:180px; *font-size:160px; border:1px solid #ddd; ...

  8. Bootstrap_表单_表单控件

    一.输入框input 单行输入框,常见的文本输入框,也就是input的type属性值为text. 在Bootstrap中使用input时也必须添加type类型,如果没有指定type类型,将无法得到正确 ...

  9. Java 8 与 .Net的平台发展

    从早期版本中,我们已经可以领略到一些令人兴奋的特性.但是开发真Andrew C.Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net.比如,Java 8 中最令人期待的Lambda表 ...

  10. Fatal error: Class 'ZipArchive' not found的解决办法

    今天在Linux底下编写导出EXCEL文件并显示输出时,抛出“ZipArchive library is not enabled” 的异常.而我在本地的windows下的代码则是运行正常的. 原因是: ...