栈与表达式

一:栈的介绍

二:栈的应用场景

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

 

算法题: 计算表达式(难点)

中缀表达式思路

 

后缀表达式代码实现:(输入一个后缀表达式,使用栈计算结果,支持小括号和多位整数)

如计算"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?

posted @ 2021-03-21 17:42  Only、  阅读(141)  评论(0)    收藏  举报