栈(Stack)是只允许在一端进行插入或删除操作的线性表。注意:栈是一种线性表
几个定义理解:
栈顶(Top):线性表允许进行插入删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端。
空栈:不含任何元素的空表。
栈的操作特性:后进先出 Last In First Out,LIFO
栈的数学性质:n个不同元素进栈,出栈元素不同排列的个数为
栈的基本操作
InitStack(&S):初始化一个空栈S
StackEmpty(S):判断一个栈是否为空,若栈S为空则返回true,否则返回false。
Push(&S,x):进栈,若栈S未满,则将x加入是指成为新栈顶。
Pop(&S,&x):出栈,若栈S非空,则弹出栈顶元素,并用x返回。
GetTop(S,&x):读栈顶元素,若栈S非空,则用x返回栈顶元素。
DestroyStack(&S):销毁栈,并释放栈S占用的存储空间。
栈的顺序存储
栈顶指针:S.top
初始时设置:S.top=-1;
栈顶元素:S.data[S.top]
进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素
出栈操作:栈不空时,先去栈顶元素之,在将栈顶指针减1
栈空条件:S.top==-1;
栈满条件:S.top==MaxSize-1;
栈长:S.top+1
栈的顺序存储类型定义
#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;
else
return false;
}
进栈
bool Push(SqStack &S,int x){
if(S.top==MaxSize-1)
return false;
S.data[++S.top]=x;//指针先加1,在入栈
return true;
}
出栈
bool Pop(SqStack &S,int &x) {
if(S.top==-1)
return false;
x=S.data[S.top--];//先出栈,指针在减1
return true;
}
读栈顶元素
bool GetTop(SqStack &S,int &x){
if(S.top==-1)
return false;
x=S.data[S.top];
return true;
}
如果栈顶指针初始化为S.top=0,即top指针指向栈顶元素的下一个位置,则入栈变为S.data[S.top++]=x;出栈变为x=S.data[--S.top];
共享栈
利用栈底位置相对不变的特性,将两个顺序栈共享一个一维数组空间,将两个栈的栈底设置在共享空间的两端,两个栈顶向共享空间的中间延伸
top0=-1时0号栈是空的,top1=MaxSize时1号栈是空的。
仅当两个栈顶指针相邻(top1-top0=1)时,判断栈为满。
当0号栈进栈时,top0先加1再赋值;当1号栈进站时top1先减再赋值
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生上溢。
栈的链式存储
栈的链式存储类型可描述为
typedef struct Linknode{
int data;
struct Linknode *next;
}*LiStack;