前言:记录一下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交流群欢迎你的加入!
群二维码:
先写到这么多
如有问题,敬请指正;
如需转载,请注明出处,谢谢!