【算法】逆波兰表达式

文章目录

  • 定义
  • 求法
  • 代码思想:

定义

逆波兰表达式也称为“后缀表达式”,是将运算符写在操作数之后的运算式。

求法

*如:(a+b)c-(a+b)/e的转换过程:

  1. 先加上所有的括号。
    (((a+b)*c)-((a+b)/e))
  2. 将所有的运算符移到括号外面
    (((ab)+ c)* ((ab)+ e)/)-
  3. 去掉所有的括号
    ab + c * ab + e /-

所以最终的结果:ab + c * ab + e /-

代码思想:

使用栈这种数据结构进行计算。

  1. 定义一个下标i进行遍历整个字符串
    【算法】逆波兰表达式_第1张图片
  2. 只要不是运算符,那就将操作数入栈。
    【算法】逆波兰表达式_第2张图片
  3. 当遇到操作符,从栈中弹出两个数进行计算,将结果入栈。同时下标i继续向后遍历。
    【算法】逆波兰表达式_第3张图片
  4. 重复上述过程。
    【算法】逆波兰表达式_第4张图片

向后遍历至运算符:
【算法】逆波兰表达式_第5张图片
进行运算,并将结果进行入栈:

【算法】逆波兰表达式_第6张图片
【算法】逆波兰表达式_第7张图片

【算法】逆波兰表达式_第8张图片
各步运算结果:
【算法】逆波兰表达式_第9张图片
代码:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (int i = 0; i < tokens.length; i++) {
            // 将数字入栈等待运算
            if (!(tokens[i].equals("+")
                    || tokens[i].equals("-")
                    || tokens[i].equals("*")
                    || tokens[i].equals("/"))) {
                stack.push(Integer.parseInt(tokens[i]));
            }
            // 如果是运算符,弹出两个数字进行运算
            else {
                int num1 = stack.pop();
                int num2 = stack.pop();
                int res = 0;
                // 进行运算
                switch (tokens[i]) {
                    case "+":
                        res = num2 + num1;
                        break;
                    case "-":
                        res = num2 - num1;
                        break;
                    case "*":
                        res = num2 * num1;
                        break;
                    case "/":
                        res = num2 / num1;
                        break;
                    default:
                        break;
                }
                // 将结果入栈
                stack.push(res);
            }
        }
        return stack.peek();
    }
}

你可能感兴趣的:(刷题之路,算法,java,开发语言)