题目描述(中等难度)

150. Evaluate Reverse Polish Notation - 图1

我们平常用的是中缀表达式,也就是上边 Explanation 中解释的。题目中的是逆波兰式,一个好处就是只需要运算符,不需要括号,不会产生歧义。

计算法则就是,每次找到运算符位置的前两个数字,然后进行计算。

解法一

学栈的时候,应该就知道这个逆波兰式了,栈的典型应用。

遇到操作数就入栈,遇到操作符就将栈顶的两个元素弹出进行操作,将结果继续入栈即可。

  1. public int evalRPN(String[] tokens) {
  2. Stack<String> stack = new Stack<>();
  3. for (String t : tokens) {
  4. if (isOperation(t)) {
  5. int a = stringToNumber(stack.pop());
  6. int b = stringToNumber(stack.pop());
  7. int ans = eval(b, a, t.charAt(0));
  8. stack.push(ans + "");
  9. } else {
  10. stack.push(t);
  11. }
  12. }
  13. return stringToNumber(stack.pop());
  14. }
  15. private int eval(int a, int b, char op) {
  16. switch (op) {
  17. case '+':
  18. return a + b;
  19. case '-':
  20. return a - b;
  21. case '*':
  22. return a * b;
  23. case '/':
  24. return a / b;
  25. }
  26. return 0;
  27. }
  28. private int stringToNumber(String s) {
  29. int sign = 1;
  30. int start = 0;
  31. if (s.charAt(0) == '-') {
  32. sign = -1;
  33. start = 1;
  34. }
  35. int res = 0;
  36. for (int i = start; i < s.length(); i++) {
  37. res = res * 10 + s.charAt(i) - '0';
  38. }
  39. return res * sign;
  40. }
  41. private boolean isOperation(String t) {
  42. return t.equals("+") || t.equals("-") || t.equals("*") || t.equals("/");
  43. }

主要就是栈的应用,比较简单。

windliang wechat

添加好友一起进步~

如果觉得有帮助的话,可以点击 这里 给一个 star 哦 ^^

如果想系统的学习数据结构和算法,强烈推荐一个我之前学过的课程,可以点击 这里 查看详情