栈和队列
栈
栈的基本概念
栈的定义
- 栈(stack): 只允许在一端进行插入或者删除操作的线性表;
- 栈顶(top): 线性表允许进行插入和删除操作的一端;
- 栈底(bottom): 固定的,不允许进行操作的一端;
- 空栈: 不含任何元素的栈表。
- 操作特性: 后进先出(Last In First Out, LIFO),故又称为后进先出的线性表。
栈的基本操作
- InitStack(&S): 初始化一个空栈S
- StackEmpty(s): 判断一个栈是否为空(若为空栈则返回true,否则返回false)
- Push(&s, x): 进栈(若栈S未满,则将x加入使之成为新的栈顶)
- Pop(&s, &x): 出栈(若栈S非空,则弹出栈顶元素,并用x返回该元素)
- GerTop(s, &x): 读栈顶元素(若栈S非空,则用x返回栈顶元素)
- ClearStack(&s): 销毁栈,并释放栈S占用的存储空间
栈的顺序存储结构
顺序栈的实现
采用顺序存储的栈称为顺序栈,是利用一组地址连续的存储单元存放子栈底到栈顶的数据元素,同时设置一个指针(top)用来指示当前栈顶的元素。
栈的顺序存储类型描述:
#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
顺序栈的基本运算
- 初始化:
void InitStack(SqStack &S){
S.top = -1; //初始化栈顶指针
}
- 判栈空:
bool StackEmpty(SqStack S){
if(S,top == -1)