Stack
基本定义
仅限定在表尾或者说栈顶进行插入删除操作的特殊线性表,LIFO
数据结构实现
顺序实现:顺序栈
代码
#define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct _sqstack{
Elemtype* base;
Elemtype* top;
int stacksize;//已分配的存储空间
}SqStack;
特点
栈空:base==top,栈满:top-base==stacksize,top指向栈顶元素下一个位置,也可以定义top指向栈顶元素,初始时top为-1
共享栈
两个栈共享一块存储空间,栈顶对向生长,可以节省存储空间并防止上溢(top1==top0即停止增长,不会出现top超出存储空间边界的情况)
链式实现:链式栈
typedef struct _stacknode{
Elemtype data;
struct _stacknode * next;
}StackNode;
typedef struct _linkstack{
StackNode * top;
}LinkStack;
特点
栈不会发生栈满溢出,并且入栈出栈都在链表头部实现(有没有头节点取决于具体实现)
基本操作
判断栈空,出栈,入栈,清空栈,销毁栈
栈的应用
- 数制转换计算时储存结果并按顺序输出
- 行编辑器的实现
- 检测括号匹配
- 中缀式求值:
- 双栈求值(符号栈和数字栈):数字入栈;当前符号优先级小于栈顶符号优先级,处理栈顶符号;当前符号优先级大于栈顶符号优先级,入栈等待;相等,消配对括号
- 中缀式转后缀式(逆波兰式):数字直接输出,注意碰到右括号时一直出栈直到左括号出栈,转为后缀式优先计算中缀式后半部分;逆波兰式求值一次弹出两个数字,此时运算顺序已经排列好了
- 中缀式转前缀式(波兰式):和前缀式构造类似,从中缀式最右侧开始倒着读,输出放入一个队列中,数字输出,符号优先级低于栈顶那么栈顶出栈,注意碰到右括号时一直出栈直到左括号出栈,转为前缀式优先计算中缀式前半半部分;波兰式求值从右往左进行,同样遇到符号一次弹出两个数字,运算顺序已经排列好
- 函数调用
- 调用过程:栈帧入栈、执行被调函数、出栈、按返回地址继续执行主调函数
- 递归
- 典型问题:汉诺塔、斐波那契数列、阶乘时间空间复杂度(On)
- 提高算法时空性能:尾递归、全局栈存储信息