声明:
栈
栈顶:top最后一个进入队列的元素。
特性:栈也是一个线性表。先进后出(LIFO)
代码实现:可以使用链表的的方式,然后每次都进行前插操作。
代码实现
共享栈(了解)
也就是一个数组,两个栈进行共同使用。一个从数组的头开始存储,一个栈从数组的尾部进行存储。
判断空间是否满的情况,(因为使用静态数组的方式定义栈一般都会添加定义top的下标位置)top1+top2=maxSize。
队列(QUEUE)
队列也属于线性表
队列:只允许在一端进行添加,在另一端进行删除。
特性:先进先出(FIFO)
队列的操作
最先插入的为rear,最后插入的为front
一端删除、一端添加,先进先出。定义rear front来记录队尾和队头
队尾的计算:(rear+1)%MaxSize; 向后移动一位
判空:rear==front
队满:(rear+1)%MaxSize = front
计算队列目前元素个数:(rear+maxSize-front)%maxSize;
双端队列
双端队列:见名知意,也就是队列的两边都可以进行插入、删除操作。
特点:一般不考代码,会考试 队列 入 / 出 的合法性。
卡特兰数:计算队列合法 出队的,最大序列数:
栈和队列的应用
括号匹配问题
特性:遇到左括号进行压入栈中,遇到右括号进行弹。出栈。
代码操作:遍历存储所有符号的数组,然后进行匹配左括号压入栈中,扫描到右括号然后去栈中获取左括号并进行匹配+栈的空判断,匹配成功左括号出栈… 直到遍历结束,还要加上 判断栈是否为空,防止还有左括号没有匹配的情况。
示例
算术表达式(常考)
术语:波兰表达式
波兰表达式=前缀表达式
逆波兰表达式=后缀表达式
中缀表达式:也就是平常使用的表达式 a+b 这样的
中缀转后缀
示例
根据 + - * / 它们运算的优先级进行排序的。
手选的话,如果 * 和 / 同级别的话,按照 左优先原则
后缀转中缀
代码操作
逻辑: 根据栈的特性。先进后出,依次从左到右扫描 后缀表达式,扫描到操作数,那么压入栈中,扫描到运算符,弹出前面的两个操作数进行计算(注意:第一个弹出的应该在运算符的右边),然后将计算结果再存入栈中。
转换练习
中缀转前缀
类似于左缀。“右优先”原则
前缀转换中缀
逻辑:和后缀逻辑一样,基于栈,只不过 扫描是从前缀表达式的 **右边开始
** 扫描到运算符的话,也是先弹出的在 右边。
示例练习
特殊矩阵
按列存储,按行存储。
按照列存储:计算矩阵中某个值的地址空间位置,那么就把当前值,前面的数据地址按列都进行相加。