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

LeetCode:150. Evaluate Reverse Polish Notation(逆波兰表达式)

2016-07-29 17:18 501 查看
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


参考:

http://blog.csdn.net/soszou/article/details/37054503

思路:由于逆波兰表达式本身不需要括号来限制哪个运算该先进行,因此可以直接利用栈来模拟计算:遇到操作数直接压栈,碰到操作符直接取栈顶的2个操作数进行计算(注意第一次取出来的是右操作数),然后再把计算结果压栈,如此循环下去。最后栈中剩下的唯一一个元素便是整个表达式的值。

https://leetcode.com/problems/evaluate-reverse-polish-notation/

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

public class EvaluateReversePolishNotation {

public static void main(String[] args) {
String[] test1 = {"2", "1", "+", "3", "*"};
String[] test2 = {"4", "13", "5", "/", "+"};

System.out.println(ovalRPN(test1));
System.out.println(ovalRPN(test2));

}

public static int ovalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";

Stack<String> stack = new Stack<String>();

for (String t : tokens) {
// 如果不是运算符(即如果是数字)
if (!operators.contains(t)) {
// 把数字压栈
stack.push(t);
} else { // 如果是运算符
// 把数字弹栈
// 栈中的元素为String,需转换
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
switch (t) {
case "+":
stack.push(String.valueOf(a + b));
break;
case "-":
stack.push(String.valueOf(b - a));
break;
case "*":
stack.push(String.valueOf(a * b));
break;
case "/":
stack.push(String.valueOf(b / a));
break;
}
}
}

returnValue = Integer.valueOf(stack.pop());

return returnValue;

}

}


如果JDK是1.7之前的,switch是不支持String的

注:2016/7/29 的LeetCode是可以通过的

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

/**
*
* if JDK before 1.7
*
* switch does not support String
*
*/

public class EvaluateReversePolishNotationBefore {

public static void main(String[] args) {
String[] test1 = {"2", "1", "+", "3", "*"};
String[] test2 = {"4", "13", "5", "/", "+"};

System.out.println(evalRPN(test1));
System.out.println(evalRPN(test2));
}

public static int evalRPN(String[] tokens) {
int returnValue = 0;
String operators = "+-*/";

Stack<String> stack = new Stack<String>();

for (String t : tokens) {
// 如果不是运算符(即如果是数字)
if (!operators.contains(t)) {
// 将数字压栈
stack.push(t);
} else { // 如果是运算符
// 将栈中的两个数字弹栈
// 栈中的元素为String, 需转换
// 这里注意栈是后进先出
int a = Integer.valueOf(stack.pop());
int b = Integer.valueOf(stack.pop());
// 更改的地方
int index = operators.indexOf(t);
switch (index) {
case 0:
stack.push(String.valueOf(a + b));
break;
case 1:
stack.push(String.valueOf(b - a));
break;
case 2:
stack.push(String.valueOf(a * b));
break;
case 3:
stack.push(String.valueOf(b / a));
break;
}
//				switch (t) {
//				case "+":
//					stack.push(String.valueOf(a + b));
//					break;
//				case "-":
//					stack.push(String.valueOf(b - a));
//					break;
//				case "*":
//					stack.push(String.valueOf(a * b));
//					break;
//				case "/":
//					stack.push(String.valueOf(b / a));
//					break;
//				}
}
}

returnValue = Integer.valueOf(stack.pop());

return returnValue;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: