栈(stack):是限定仅在表尾(栈顶)进行插入和删除操作的线性表。
-
通常把允许插入和删除的一端称为 栈顶(top),另一端称为 栈底(bottom),不含任何任何数据元素的栈称为 空栈。栈又称为 后进先出(Last In First Out) 的线性表,简称 LIFO 结构。
-
栈 是线性表的特例,其具备先进后出 FILO 特性。可以使用线性表的顺序存储结构(即数组)实现栈,将之称之为 顺序栈;可以使用单链表结构实现栈,将之称之为 链栈。
栈的两种常用操作:
栈的插入操作叫做进栈,也称压栈、入栈,栈的删除操作叫做出栈。
栈的进出变化:
3个整型数字元素1、2、3依次进栈,会有5种出栈次序:
1) 1,2,3进,3,2,1出。出栈次序为321.
2) 1进1出,2进2出,3进3出。出栈次序为123.
3) 1进,2进2出,3进3出,1出。出栈次序为231.
4) 1进,2进,2出,1出,3进3出。出栈次序为213.
5) 1进,1出,2进,3进,3出,2出。出栈次序为132.
栈的抽象数据结构类型
ADT 栈(stack)
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
InitStack(*S); //初始化操作,建立一个空栈S
DestroyStack(*S); //若栈存在,则销毁它
ClearStack(*S); //将栈清空
StackEmpty(S); //若栈为空,返回true,否则返回false
GetTop(S,*e); //若栈存在且非空,用e返回S的栈顶元素
Push(*S,e); //若栈S存在,插入新元素e到栈S中并称为栈顶元素
Pop(*S,*e); //删除栈S中栈顶元素,并用e返回其值
StackLength(S); //返回栈S的元素个数
endADT
栈的顺序存储结构及实现
栈是线性表的特例,栈的顺序存储其实是线性表顺序存储的简化,简称为顺序栈。
栈的顺序存储结构及实现
进栈操作即插入操作,出栈即删除操作,实现如下:
/*
进栈操作push
插入元素e为新的栈顶元素
*/
Status Push(SqStack *S, SElemType e)
{
/*栈满*/
if(S->top == MAXSIZE - 1)
{
return ERROR;
}
/*栈顶指针增加一*/
S->top++;
/*将新插入元素赋值给栈顶空间*/
S->data[S->top] = e;
return OK;
}
/*出栈pop*/
Status Pop(SqStack *S, SElemType *e)
{
if(S->top == -1)
return ERROR;
/*将要删除的栈顶元素赋值给e*/
*e = S->data[S->top];
/*栈顶指针减一*/
S->top--;
return OK;
}