栈与表达式
一:栈的介绍

二:栈的应用场景


三:前(波兰式)、中、后缀表达式(逆波兰表达式)



算法题: 计算表达式(难点)
中缀表达式思路




后缀表达式代码实现:(输入一个后缀表达式,使用栈计算结果,支持小括号和多位整数)
如计算"3 4 + 5 * 6 -"的步骤和代码如下:




中缀表达式转后缀表达式思路步骤分析:

递归实现:
1 class Solution { 2 // 全局变量 一次遍历记录位置 3 int pos = 0; 4 public int calculate(String s) { 5 return calculateHelper(s); 6 } 7 private int calculateHelper(String s) { 8 Deque<Integer> stack = new ArrayDeque<> (); 9 // 默认符号是+ 简化处理 10 char preSign = '+'; 11 int num = 0; 12 for (; pos < s.length(); pos++) { 13 char ch = s.charAt(pos); 14 // 递归开始 迈过'(' 这样不会无限递归 15 if (ch == '(') { 16 pos++; 17 // 获取子表达式的值 18 num = calculateHelper(s); 19 } 20 // 如果是数字就累计计算 21 if (Character.isDigit(ch)) { 22 num = 10 * num + ch - '0'; 23 } 24 // 处理 非数字和非空格即符号 或者 因为长度到达而滞留的数字 25 if ((!Character.isDigit(ch) && !Character.isSpaceChar(ch)) || s.length() == pos + 1) { 26 switch (preSign) { 27 case '+': stack.push(num); break; 28 case '-': stack.push(-1 * num); break; 29 case '*': stack.push(stack.pop() * num); break; 30 case '/': stack.push(stack.pop() / num); break; 31 } 32 // 更新字符 相当于中缀转为后缀表达式 33 preSign = ch; 34 // 清空当前数字 35 num = 0; 36 } 37 // 是跳出循环的关键 不能像'('一样先迈过 需要回到上层 让上层处理 38 // 上层在处理'('时进入的递归 因为pos是全局变量 再向后一步就迈过了 ')' 39 // 开始正常处理后面字符 40 if (ch == ')') { 41 break; 42 } 43 } 44 // 只当场计算了 * / 的结果 45 // + - 仍然在栈中 46 int sum = 0; 47 for (int tmp: stack) { 48 sum += tmp; 49 } 50 // 返回子表达式的结果 51 return sum; 52 } 53 }
参考:https://www.bilibili.com/video/BV1E4411H73v?
浙公网安备 33010602011771号