您的位置:首页 > 编程语言 > Lua

【LeetCode】150 Evaluate Reverse Polish Notation 小侃小解

2015-11-25 13:44 656 查看
Difficulty: Medium

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


小侃:
这题先搞明白什么是RPN,就是后置算式,还算好心啦,举了俩例子,就算不会RPN看例子也能懂,然后实际过程就跟例子说的一样 2 1 + 等与 2+1, 但是例子第二行给了更高级的例子,然后就能推出,找到第一个运算符号,然后取出最前面的两个数,然后算结果,然后找下一个运算符号,然后拿上一个结果并且再往前找另一个数。这个就是规律啦。然后我首先想到的方法,找到一个能后进先出的存储方式,然后从头开始读,每看到一个数就扔进去,然后看到一个符号就往出拿俩数算,然后把结果算好了放进去,接着往下读。以此类推。

可是,这个存储方式我就记得叫堆(stack),然后至于怎么用,干嘛用,忘却了。。。好吧,回忆什么是stack,什么是queue。。。

以下就是我这次新学的啦:

特别感谢:http://www.jb51.net/article/44645.htm 写的stack简易易懂!

stack 是一种后进先出的存储方式 LIFO(Last
In,Frist Out)。


A. 新建stack:

java.util.Stack<String> stack = new java.util.Stack<String>();

B. 放东西进stack:

stack.push("c"); // 比如说已经有了 a,b 那这次push之后就变成了a,b,c

C. 取东西从stack:

Sring value = stack.pop(); // 还比如说现在有 a,b在里面,那这次取出的就是b,value
= b

D. 我就看看最后一个是啥,我不取:

String value = stack.peek(); //
还比如说现在有 a,b在里面,那这次value=b, 但是b还在stack里面

E. 查看是否为空:

Stack.empty(); // 还有就return true,没有就return false。

F. 如果你想枚举:

Enumeration items = stack.elements();

G. 如果你想查找:

int distance = stack.search(a) ;//注意,这个回的是距离,还是a,b的例子,那这个distance就是2

我能找到的我觉得跟stack相关有用的就这么多啦,足够做这道题啦~

小侃就到这里~

小解:


<span style="font-size:18px;">public class Solution {
public int evalRPN(String[] tokens) {
if (tokens == null){
return 0;
}
if (tokens.length < 2){
return Integer.valueOf(tokens[0]);
}
Stack<String> stack = new Stack<String>();
int result = 0;

String op = "+-*/";
for (String str : tokens){
if (!op.contains(str)){
stack.push(str);
}else{
if(!stack.empty()){
int B = Integer.valueOf(stack.pop());
if(!stack.empty()){
int A = Integer.valueOf(stack.pop());
switch(str){
case "+" : stack.push(A+B+"");break;
case "-" : stack.push(A-B+"");break;
case "*" : stack.push(A*B+"");break;
case "/" : stack.push(A/B+"");break;
}
}
}
}
}
result = Integer.valueOf(stack.pop());

return result;
}
}</span>

小结:

可惜只打败了5%的人,所以肯定有哪里写的效率不好,唯一好处是直接,所以不难记。。

其实。。我一直有一点点犹豫,因为我并没有handle exception,我就很奇怪如果给一个错的input,比如给一对数然后没有符号怎么办,虽然最后妥协在题里说,给定的RPN公式。。。所以假定没有错。。先到这里吧~

不是最优解,拍砖请轻拍~然后拍完记得告诉我更好的办法呦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 算法