1.栈的定义:
栈是操作受限的线性表,只允许在某一端进行插入或删除。
栈顶:允许插入或删除操作的一端。
栈底:固定的,不能进行插入或者删除操作的一端。
空栈:不含任何元素的空表。
栈的操作特性:先行后出。
栈的数学性质:n个不同的元素进栈,出栈元素不同的排列的个数为。这个数被称为卡特兰数。
2,顺序栈:
基本实现:用一个指示当前栈顶元素的指针top来表示栈顶位置。
3,共享栈:
两个栈共享同一个数组空间,两个栈的栈底分别在栈的两端,向中间延伸。
两个栈的栈顶指针都指向栈顶元素,top1 = -1时1号栈为空,top2 = MaxSize -1时2号栈为空,当两个栈顶指针相邻时栈满(top2 - top1 = 1)
#define MaxSize 50
typedef struct{
int data[MaxSize];
int top;
}SqStack;
栈顶指针为S.top,初始时top = -1,当S.top = MaxSize - 1 时表示栈满,S.top = -1时表示栈为空。
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
bool StackEmpty(SqStack S){ //判断栈是否为空
if(S.top == -1){
return true;
}
return false;
}
入栈操作:当栈不满时,栈顶指针先加一再赋值
bool Push(SqStack &S,int e){ //进栈操作
if(S.top == MaxSize-1){
return false;
}
S.top++;
S.data[S.top] = e;
return true;
}
出栈操作:当栈不为空时,栈顶指针先赋值再减一
bool Pop(SqStack &S,int &e){ //出栈操作
if(S.top == -1){
return false;
}
e = S.data[S.top];
S.top--;
return true;
}
读栈顶元素
bool Get(SqStack S,int &x){ //读栈顶元素
if(S.top == -1){
return false;
}
x = S.data[S.top];
return true;
}
完整代码
#include<stdio.h>
#define MaxSize 50
typedef struct{
int data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
bool StackEmpty(SqStack S){ //判断栈是否为空
if(S.top == -1){
return true;
}
return false;
}
bool Push(SqStack &S,int e){ //进栈操作
if(S.top == MaxSize-1){
return false;
}
S.top++;
S.data[S.top] = e;
return true;
}
bool Pop(SqStack &S,int &e){ //出栈操作
if(S.top == -1){
return false;
}
e = S.data[S.top];
S.top--;
return true;
}
bool Get(SqStack S,int &x){ //读栈顶元素
if(S.top == -1){
return false;
}
x = S.data[S.top];
return true;
}
int main(){
SqStack S;
int e,x;
InitStack(S);
Push(S,3);
Push(S,4);
Push(S,2);
Pop(S,e);
Get(S,x);
printf("%d",x);
return 0;
}