目录
一.逻辑结构
栈 |
|
栈顶 |
|
栈底 |
|
操作特性 |
|
数学性质 |
(卡特兰数) |
二.存储结构
2.1顺序存储
顺序栈的 定义 |
|
顺序栈的实现 | #define Maxsize 50 typedef struct { Elemtype data[Maxsize]; //存放栈中元素 int top; //栈顶指针 } SqStack; |
基本操作代码 |
2.2共享栈
定义 |
|
特点 | |
目的 |
|
2.3链式存储
概念 |
|
优点 |
|
特点 |
|
链式栈的实现 | typedef struct Linknode { Elemtype data; //存放栈中元素 struct Linknode *next; //栈顶指针 } * LiStack; |
2.3.1运算与操作
InitStack(&S) | 初始化栈 |
|
StackEmpty(S) | 判断栈是 否为空 |
|
Push(&S,x) | 进栈 |
|
Pop(&S,&x) | 出栈 |
|
GetTop(S,&x) | 读栈顶元素 |
|
DestroyStack(&S) | 销毁栈 |
|
三.栈的应用
括号匹配 |
•
初始设置一个空栈,顺序读入括号
•
若是右括号,置于栈顶
•
若是左括号,压入栈中
算法结束时,栈为空,否则括号序列不匹配(具体例子见下面考点
3的例题)
| |
递归 |
•
在递归调用的过程中,系统为每一层的
返回点、局部变量、传入
实参
等开辟了递归工作栈来进行数据存储
•
递归次数过多容易造成栈溢出等
•将递归算法转换为非递归算法,通常需要借助栈来实现
这种转换, 消除递归并不一定需要栈
•
效率不高: 原因是递归调用过程中包含很多重复的计算
•
代码简单,容易理解
| |
表达式 求值 |
考点1: 后缀表达式和正常表达式的相互转换
考点2:
涉
及到
编译
原理的求
值过
程
| |
考点3: 中缀到后缀
表达式转换的过程
|
----ssss