leetcode - 150. Evaluate Reverse Polish Notation

前言:记录一下leetcode上的一道题目:

题目网址:https://leetcode.com/problems/evaluate-reverse-polish-notation/description/

问题描述:

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +-*/. Each operand may be an integer or another expression.

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

  思路:

  • 当前拥有的内容:一个字符串数组,加减乘除,其余都是整数的字符串
  • 可以对此字符数组中的内容进行栈的相关操作,首先创建一个整数类型的栈来放置这些数。
    • 如果是整数形式的字符串;就把这个字符串转化成为整数入栈,这是为了便于后边,遇到运算符的时候方便出栈操作,并且再进行后期的入栈操作;
    • 如果是运算符号字符串就连续有两次出栈,此处根据示例,确定符号放在谁的前边,做了相应的运算的结果还要再次入栈;
    • 就这样,最后得到的会是一个整数。就是我们想要的,最后这个代码虽然是Acceped的但是还是有不足的地方,不能很好处理一些特殊情况。

解题Java代码如下:代码是我从Leetcode的Discuss里,摘抄过来的。网址:https://leetcode.com/problems/evaluate-reverse-polish-notation/discuss/

 1 class Solution {
 2     public int evalRPN(String[] a) {
 3       Stack<Integer> stack = new Stack<Integer>();
 4         
 5       for (int i = 0; i < a.length; i++) {
 6         switch (a[i]) {
 7           case "+":
 8             stack.push(stack.pop() + stack.pop());
 9             break;
10 
11           case "-":
12                 //注意"-"和"/"放置的位置
13             stack.push(-stack.pop() + stack.pop());
14             break;
15 
16           case "*":
17             stack.push(stack.pop() * stack.pop());
18             break;
19 
20           case "/":
21             int n1 = stack.pop(), n2 = stack.pop();
22             if(n1 == 0){
23                 System.out.println("原逆波兰式有误");        
24             }
25             stack.push(n2 / n1);
26             break;
27                 
28           default:
29                 
30             stack.push(Integer.parseInt(a[i]));
31         }
32       }
33     return stack.pop();
34     }
35 }

 扩展:

如果是要了解更多的内容,可以看看关于Swift相关的栈操作;据我所知Objective-C没有提供相应的栈的操作方法,Swift的话,有往数组中添加元素,有获取到栈顶的元素的方法,有出栈的方法,但是没有明确的入栈之类的方法,下边的链接给出了相应的Swift的入栈、出栈、判断栈是否为空、计算栈中的元素的个数的相关内容:

https://github.com/raywenderlich/swift-algorithm-club/tree/master/Stack

 

iOS交流群欢迎你的加入!

群二维码:

先写到这么多

如有问题,敬请指正;

如需转载,请注明出处,谢谢!

 

posted on 2017-11-23 21:12  ITCoderW  阅读(305)  评论(0编辑  收藏  举报

导航