dart实现150逆波兰表达式求值

[toc]

题目:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
要求
根据 逆波兰表示法,求表达式的值。
有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

四则运算

分为三种

  1. 前缀表达式(prefix expression),又称为波兰表达式
    1. 运算符在前,后面的操作数字运算(二叉树前序遍历结果)
  2. 中缀表达式(infix expression)(二叉树中序遍历结果)
  3. 后缀表达式 (positfix expression),又称为逆波兰表达式(二叉树后序遍历结果)
    1. 运算符在后,前面的操作数字运算
前缀表达式 中缀表达式 后缀表达式
+ 1 2 1 + 2 1 2 +
+ 2 * 3 4 2 + 3 * 4 2 3 4 * +
+ 9 * - 4 1 2 9 + (4-1)*2 9 4 1 - 2 * +

思路

  • 遇见数字,直接入栈
  • 遇见符号
    • 弹出栈顶的右操作数
    • 弹出栈顶的左操作数
    • 使用符号进行计算,讲计算结果入栈
  • 最后占中的唯一数字就是后缀表达式的计算值

代码


class LeetCode150 {
  static int evalRPN(List tokens) {
    const List sysbols = ['+', '-', '*', '/'];
    List numStack = [];
    if (tokens == null && tokens.length == 0) return 0;
    // int result = 0;
    for (var item in tokens) {
      if (!sysbols.contains(item)) {
        numStack.add(int.parse(item));
      } else {
        int right = numStack.removeLast();
        int left = numStack.removeLast();
        switch (item) {
          case "+":
            numStack.add(left + right);
            break;
          case "-":
            numStack.add(left - right);
            break;
          case "*":
            numStack.add(left * right);
            break;
          case "/":
            var t = (left.abs()) / (right.abs());
            numStack.add(t.floor());
            break;
          default:
        }
      }
    }
    return numStack.last;
  }
}

main(List args) {
  List tokens = ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"];
  print(LeetCode150.evalRPN(tokens));
}

执行结果结果

22

你可能感兴趣的:(dart实现150逆波兰表达式求值)