目录
补充一个小知识点:n个不同元素进栈,那么出栈元素不同的排列的个数为 。
上述公式被称为卡特兰数(Catalan)。
下面是本文思维导图:
1、初始化
先定义顺序栈的主体(这里的元素类型以int型为例):
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct {
int data[MaxSize]; //静态数组存放栈中元素
int top; //栈顶指针
}SqStack;
此时内存中开辟的存储空间如下图所示:
然后是初始化栈,初始时需要把栈顶指针指向-1:
//初始化栈
void InitStack(SqStack& S) {
S.top = -1; //初始化栈顶指针
}
2、判断栈是否为空
判断栈是否为空,只需判断top指针是否等于 -1 即可:
//判断栈空
bool StackEmpty(SqStack S) {
if (S.top == -1) return true; //栈空
else return false; //栈非空
}
3、入栈
先判断栈是否已满,然后注意top指针先自增,再加入元素。
//新元素入栈
bool Push(SqStack& S, int x) {
if (S.top == MaxSize - 1) return false; //栈满,报错
S.top = S.top + 1; //指针先加1
S.data[S.top] = x; //新元素入栈
return true;
}
4、出栈
注意先将元素出栈,再将指针自减。(代码中x前面的“&”表示让x可以把值带出方法外)
bool Pop(SqStack& S, int &x) {
if (S.top == -1) return false; //栈空,报错
x = S.data[S.top]; //栈顶元素先出栈
S.top = S.top - 1; //指针再减1
return true;
}
5、读取栈顶
和出栈操作差不多,唯一不同的就是无需改变top指针的值:
bool GetTop(SqStack& S, int& x) {
if (S.top == -1) return false; //栈空,报错
x = S.data[S.top]; //x记录栈顶元素
return true;
}
6、top指针初始化为0的情况
如果刚开始top指针不初始化为-1而是初始化为0,那么需要调整一下判断栈满还是空的条件,以及入栈时先加入元素,再让top指针加1;出栈的时候先让top指针减1,再将栈顶元素出栈。
7、共享栈
共享栈,即两个栈共享同一片存储空间,它可以在顺序栈的基础上提高内存利用率。
刚开始我们会设置两个栈顶指针,分别代表0号栈和1号栈:
//共享栈的初始化
typedef struct {
int data[MaxSize]; //静态数组存放栈中元素
int top0; //0号栈栈顶指针
int top1; //1号栈栈顶指针
}ShStack;
//初始化栈
void InitStack(ShStack& S) {
S.top0 = -1; //初始化栈顶指针
S.top1 = MaxSize;
}
此时内存中的存储空间如下↓
判断共享栈是否栈满:
if(top0 + 1 == top1) printf("栈满");
else printf("栈空");