3.1_1 栈的基本概念
1、栈的基本概念
- 栈是只允许在一端进行插入或删除操作的线性表
- 重要术语:栈顶、栈底、空栈
- 逻辑结构:与普通线性表相同(线性结构)
- 数据的运算:与普通线性表插入、删除操作有区别
- 栈顶可插入和删除
- 栈底不允许插入和删除
2、栈的基本操作
3、卡特兰数
4、知识回顾与重要考点
3.1_2栈的顺序存储实现
用顺序存储方式实现的栈
顺序栈的缺点:栈的大小不可变
1、顺序栈的定义
- 顺序存储:给各个数据元素分配连续的存储空间,大小为MaxSize*sizeof(ElemType)
- sq:sequence—顺序
- top:栈顶指针,也是数组的下标,从0开始
2、初始化操作
- 刚开始栈顶指针指向0这个位置是不合理的,因为这时栈中并没有数据元素,故top此时指向-1
- 故判断是否栈空只要判断top是否指向-1即可
3、进栈操作
如果上下两句代码颠倒,则等价于:S.data[S.top++]=x;
- 因为MaxSize相当于元素个数,故top(相当于下标)不能超过MaxSize-1
- S.data[S.top] = x;把数据元素传到data数组中tpp指针所指向的地方
4、出栈操作
5、读栈顶元素操作
读栈顶元素操作与出栈操作的唯一区别:
6、另一种方式:top初始指向0(审题时要注意)
7、共享栈
- 两个栈共享同一片空间
- 可以提高空间的利用率
- 设置两个栈顶指针(如0号栈top0和1号栈top1)
0号栈从下往上依次递增,1号栈从上往下依次递增 - 栈满条件:top0 + 1 == top1
8、知识回顾与重要考点
(最后一行:栈满条件)
3.1_3 栈的链式存储实现
1、链栈的定义
- 头插法建立单链表 -> 进栈操作
- 对头结点的“后删”操作 -> 出栈操作
3.2.2_栈在表达式求值中的应用(上)![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ec9d65294851a0af14f05807e7c1a23f.png)
1、波兰表达式和逆波兰表达式
(界限符也就是我们平时算式中用到的括号)
2、中缀表达式转后缀表达式(手算)
**中缀表达式中括号里出现的运算符优先,计算的先后顺序都会影响后缀表达式中运算符的先后顺序 **
后缀表达式不唯一:
- 从前开始(计算机中)
- 从后开始
“左优先原则”
只要左边的运算符能先计算,就优先算左边的(可保证运算顺序唯一)
这个式子就是先加法,后面再先乘除后加减
3、后缀表达式的计算(机算)
A入栈,B入栈,如果扫描到运算符,那么弹出A和B,执行相应运算,运算结果压回栈顶。