一、栈
栈是一种先进后出的数据结构,关于栈的js实现:我的git仓库
二、栈的应用
2.1 后缀表达式
后缀表达式也叫逆波兰表达式,平时我们使用的表达式如 1+2*3
是中缀表达式符合人民的阅读习惯,为了让计算机也能够理解表达式的意思,就需要使用后缀表达式 1 2 3 * +
2.1.1 用栈计算后缀表达式
- 创建两个栈,一个为stack动态存放运算符,一个为post存放后缀表达式
- 从左到右扫描中缀表达式,若都到操作数,直接存入post栈中,若读到的是运算符:
- 栈为空时或左括号
(
直接存入stack - 遇到右括号
)
将stack中与左括号间的运算符全部出栈,存入post栈中,注意:左右括号()
直接消除,不需要存入栈中 - 非括号且栈不为空,将该运算符和stack栈顶运算符做比较:高于或等于栈顶运算符就直接存入stack,否则将栈顶元素出栈,存入post,然后存入该运算符到stack
- 栈为空时或左括号
2.1.2 用二叉树
- 将中缀表达式转换为表达式树
- 表达式树的根节点为优先级最低且最靠右的操作数
- 表达式树的树叶为操作数,其它节点是操作符
- 后序遍历表达式树得到后缀表达式
参考:表达式树
2.1.3 加括号法
- 按运算符优先级对中缀表达式加括号,原先的括号不用管
- 将运算符移到括号的后面
- 去掉所有括号
2.1.4 后缀表达式转中缀表达式
- 从左到右遍历后缀表达式
- 用辅助栈temp存储结果
- 将操作数放入辅助栈temp
- 遇到操作符,弹出temp栈中后两个操作数,与操作符计算后重新放入temp
- 直到遍历完,temp中的数就是最后的结果
力扣:逆波兰表达式求值
1.递减栈的使用
let Node = function(idx, val) {
this.idx = idx;
this.val = val;
}
var dailyTemperatures = function(T) {
const len = T.length;
if(!len) return [];
let stack = [];
let list = new Array(len);
for(let i = 0; i < len; i++) {
// 当递减栈为空,就把元素加入栈中
if(stack