栈的定义
栈只允许在一端进行插入或删除操作的线性表。
栈是一种特殊的线性表,只不过对于普通的线性表而言,当我们进行插入,删除一个数据元素的时候,我们可以在任意地方进行插入和删除,但对于栈而言,我们会限制它的插入删除操作,要求插入删除操作只能在栈顶的一端进行。
线性表是具有相同数据类型的n个数据元素的有限序列,其中n为表长,若n=0时,为空表,若用L代表线性表的话,则一般表示为:L=(a1,a2,a3,...an)
栈与普通的线性表相比,其实是具有相同的数据结构的,这些数据元素之间都存在一对一,一前一后的逻辑关系。
栈的常考题型
会告诉进栈顺序,然后让我们判断有哪些出栈顺序?
栈顶(Top)线性表允许插入和删除的那一端。
栈底(Bottom)固定的,不允许插入和删除的另一端。
栈的特性:后进先出
栈的基本操作
InitStack(&S):初始化一个空栈。
Push(&S,x):入栈,若栈未满,则将x加入,使其成为新栈顶。
Pop(&S,&x):出栈,若栈为非空,弹出栈顶元素,并用x返回。
DestroyStack(&S):销毁栈,并释放栈S所占用的存储空间。
GetTop(S,&x):读栈顶元素,但不出战,若栈为非空,则使用x返回。
顺序栈
采用顺序存储的栈称为顺序栈。
由于顺序栈使用的是静态数组来存放数据元素的,所以当数据元素存满时,他的容量不可改变,如何解决这个问题?
1 可以事先分配较大的存储空间,但是会造成空间浪费,从而引出了:
共享栈的概念
共享栈是指两个顺序栈共享一个一维数组空间。
#define MaxSize 10
typedef struct{
int data[MaxSize];
int top;
}SqStack;
//顺序栈
void InitStack(SqStack &S){
S.top=-1;
}
//初始化栈
bool push(SqStack &S,int x){
if(S.top==MaxSize-1){
return false;
}
S.top=S.top+1;
S.data[S.top]=x;
return true;
}
//入栈
bool pop(SqStack &S,int &x){
if(S.top==-1){
return false;
}
x=S.data[S.top];
S.top=S.top-1;
return true;
}