写在最前
白天事情太多了,总结的晚了,考研自用
一、栈的基本概念
- 栈:只允许在一端进行插入或删除的线性表。
- 栈顶:线性表允许进行插入和删除的那一端。
- 栈底:线性表不允许进行插入和删除的另外一端
- 空栈:不含任何元素的空表。
- 栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为 1 n + 1 C 2 n n {{1} \over {n+1}}C_{2n}^{n} n+11C2nn(卡特兰数)。
栈首先是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。
二、栈的基本操作
- InitStack(&S):初始化一个空栈。
- StackEmpty(S):判断一个栈是否为空。(栈S为空,返回true;不为空,返回false)
- Push(&S,x):入栈,若栈S未满,则新入栈的元素为新栈顶。
- Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
- GetTop(S,&x):读取栈顶元素,若栈S非空,则用x返回栈顶元素。
- DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。
读取栈顶元素只读取元素不进行删除操作,注意区别的销毁栈。
三、栈的顺序存储结构
3.1顺序栈
采用顺序结构的栈成为顺序栈
//顺序栈的定义
#define MaxSize 10
typedef struct
{
ElemType data[MaxSize]; //静态数组中存放栈的元素
int top; //栈顶指针
} SqStack;
//初始化
void InitStack(SqStack &S)
{
S.top=-1;
}
//判栈空
bool StackEmpty(SqStack S)
{
if(S.top==-1)
return ture;
else
return false;
}
//进栈
bool Push(SqStack &S,ElemType x)
{
if(S.top==MaxSize-1)
return false;
S.data[++top]==x;
return true;
}
//出栈
bool Pop(SqStack &S,ElemType &x)
{
if(S.top==-1)
return false;
else
x=S.data[top--];
return true;
}
//读取栈顶元素
bool GetTop(SqStack S,EleType &x)
{
if(S.top==-1)
return false;
else
x=S.data[top];
return true;
}
注 意 : \color{red}注意: 注意:
- 初始化栈顶指针S.top=-1,栈顶元素:S.data[S.top]
- 栈空条件:S.top==-1,栈满条件:S.top==MaxSize-1,栈长:S.top+1
- 缺点:栈的大小不可变
3.2共享栈
针对栈的栈底位置相对不变,可以让两个顺序栈共享一个一维数组空间,这样的栈称为共享栈。
- top0=-1时0号栈为空,top1=MaxSize时栈为空
- top1-top0=1时栈满
- 0号栈进栈t++op0后赋值,1号栈进栈- -op1后赋值,出栈与之相反
四、栈的链式存储结构
采用链式存储的栈称为链栈。
//链栈
typedef struct LinkNode
{
ElemType data;
struct LinkNode *next;
} LiStack;
链栈的操作和链表相似,出栈入栈的操作都在链表的表头进行。
五、易错试题
待补充
写在最后
付出,就有收获!