文章目录
一、栈
概念:先进后出
不同的出栈序列的个数:(卡特兰数)
基操:
InitStack(&S); //初始化空栈
StackEmpty(S); //判空
Push(&S,x); //进栈
Pop(&S,x); //出栈
GetTop(S,&x); //读栈顶元素
DestroyStack(&S); //销毁栈
1.顺序栈
(1)定义:利用连续的存储空间
#define MaxSize 50;
typedef struct {
ElemType data[MaxSize]; //存放栈中数据元素
int top; //存放栈顶指针
}SqStack;
栈顶指针:S.top,初始时设置S.top == -1;
栈顶元素:S.data[S.top]
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素。
出栈操作:栈不空时,先取栈顶元素值,再将栈顶指针减1。
栈空条件:S.top == -1
栈满条件:S.top == MaxSIze -1;
栈长:S.top+1
(2) 顺序栈的基本操作
1.初始化
void InitStack(SqStack &S){
S.top = -1;
}
2.栈判空
bool StackEmpty(SqStack S){
if(S.top == -1)
return true;
else
return false;
}
3.进栈
bool Push(SqStack &S,ElemType x){
if(S.top == MaxSize-1)
return false; //栈满
S.data[++S.top] = x;
return true;
}
4.出栈
bool Pop(SqStack &S,ElemType &x){
if(S.top == -1)
return false;
x = S.data[S.top--];
return true;
}
5.读取栈顶元素
bool GetTop(SqStack &S,ElemType &x){
if(S.top == -1)
return false;
x = S.data[S.top];
return true;
}
2.共享栈
(1)定义:让两个顺序栈共享一维数组,栈底分别设置在两端,栈顶向共享中间延伸。
判断栈满:(top1 - top0 )==1
进栈时,0号栈top0先加1再赋值,1号栈top1先减1再赋值。
#define maxsize 100
# define elemtp int
typedef struct{
elemtp stack[maxsize]; //栈空间
int top[2]; //两个栈顶指针
}stk;
stk s;
//入栈操作
int Push(int i,elemtp x){
//入栈操作,i为栈号,i=0表示左边的s1栈,i=2表示右边的栈s2,x是入栈元素
//入栈成功返回1,否则返回0
if(i<0 || i>1){
printf("栈号输入不对"