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


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;
		
	}
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值