1.栈的基本概念
1)栈的定义
- 栈是只允许在一端进行插入或删除的线性表。栈顶是线性表允许插入删除的一端。栈底是固定的不允许进行插入和删除的另一端。空栈是不包含任何元素的空表
2)栈的数学性质
- n个不同元素进栈,出栈元素不同排列的个数为(1/n+1)C2n(n)。该公式称为卡特兰数
3)栈的基本操作
-
InitStack(&S)
- 初始化一个空栈S
-
StackEmpty
- 判断一个栈是否为空,若栈S为空则返回true,否则返回false
-
Push(&S,x)
- 进栈,前提是栈未满
-
Pop(&S,&x)
- 出栈,前提是栈非空
-
GetTop(S,&x)
- 读栈顶元素,若栈S非空,则用x返回栈顶元素
-
DestroyStack(&S)
- 销毁栈,并释放栈S占用的存储空间
2.栈的顺序存储结构
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)顺序栈的基本运算
- 初始化
void InitStack(SqStack &S){
S.top=-1;
}
- 判空栈
bool StackEmpty(SqStack &S){
if(S.top==-1)
return true;
else
return false;
}
- 进栈
bool Push(SqStack &S,Elemtype x){
if(S.top==MaxSize-1)
return false;
S.data[++S.top]=x;
return true;
}
- 出栈
bool Pop(SqStack &S,ElemType &x){
if(S.top==-1)
return false;
x=S.data[S.top--];
return true;
}
- 读栈顶元素
bool GetTop(SqStack S,ElemType &x){
if(S.top==-1){
return false;
x=S.data[S.top];
return true;
}
3)共享栈
-
定义
- 利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸
-
判空
- top0=-1时0号栈为空,top1=MaxSize时1号栈为空
-
判满
- top1-top0=1时,栈满
3.栈的链式存储结构
1)定义
- 采用链式存储的栈成为链栈
2)特性
- 便于多个栈共享存储空间和提高效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有操作都在单链表的表头进行的。采用链式存储便于结点的插入和删除
3)结构类型
typedef struct Linknode{
ElemType data;
struct Linknode *next;
} *LiStack;