Evaluate Reverse Polish Notation
来源:互联网 发布:恒慧融软件 编辑:程序博客网 时间:2024/06/06 02:28
仅提供个人的一种解题思路,未必是最优,仅供各位参考!
import java.util.Stack;/** * * <p> * ClassName SolutionEvaluateReversePolishNotation * </p> * <p> * 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 * </p> * * @author wangxu wangx89@126.com * <p> * Date 2014-9-11 下午08:11:44 * </p> * @version V1.0 * */public class SolutionEvaluateReversePolishNotation {public static int evalRPN(String[] tokens) {// 基本思路是采用栈来存储数字,然后读取token,当读取到的是+-*/时候,进行出栈操作Stack<Integer> numStack = new Stack<Integer>();// 存储数字的栈Stack<String> opStack = new Stack<String>();// 存储操作符的栈int length = tokens.length;String op = "";for (int i = 0; i < length; i++) {String temp = tokens[i];if ("+".equals(temp)) {if (i < length - 1) {// 说明当前操作符并非最后一个op = tokens[i + 1];// 取出当前操作符的后一个,比较他们的优先级,如果后一个比当前优先级高,那么当前操作符入栈,如果后一个没有当前优先级高,那么计算当前的操作符if ("*".equals(op) || "/".equals(op)) {// 只有当后面一个是*或者/时,将当前操作符入栈opStack.push("+");} else {// 说明可能是+或者-或者数字,但不影响运算顺序// 直接使用当前操作符计算即可int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 + num1);}} else {// 说明已经是最后一个操作符了int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 + num1);}} else if ("-".equals(temp)) {if (i < length - 1) {op = tokens[i + 1];if ("*".equals(op) || "/".equals(op)) {opStack.push("-");} else {// 直接使用当前操作符计算即可int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 - num1);}} else {int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 - num1);}} else if ("*".equals(temp)) {int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 * num1);} else if ("/".equals(temp)) {int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 / num1);} else {int t = Integer.parseInt(temp);numStack.push(t);}// 开始判断操作符栈,如果操作符栈非空,那么需要先将其出栈操作while (!opStack.isEmpty()) {String opTemp = opStack.pop();if ("+".equals(opTemp)) {int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 + num1);} else if ("-".equals(opTemp)) {int num1 = numStack.pop();int num2 = numStack.pop();numStack.push(num2 - num1);}}}return numStack.pop();}public static void main(String[] args) {String str[] = { "-78", "-33", "196", "+", "-19", "-", "115", "+", "-", "-99", "/", "-18", "8", "*", "-86", "-", "-", "16", "/", "26", "-14", "-", "-", "47","-", "101", "-", "163", "*", "143", "-", "0", "-", "171", "+", "120", "*", "-60", "+", "156", "/", "173", "/", "-24", "11", "+", "21", "/", "*", "44","*", "180", "70", "-40", "-", "*", "86", "132", "-84", "+", "*", "-", "38", "/", "/", "21", "28", "/", "+", "83", "/", "-31", "156", "-", "+", "28", "/","95", "-", "120", "+", "8", "*", "90", "-", "-94", "*", "-73", "/", "-62", "/", "93", "*", "196", "-", "-59", "+", "187", "-", "143", "/", "-79", "-89","+", "-" };int res = evalRPN(str);System.out.println(res);}}
0 0
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- Evaluate Reverse Polish Notation
- int main(int argc,char* argv[])详解
- C++: 跨平台注意事项
- SPU/SKU/商品
- PS 滤镜——运动模糊
- ubuntu live CD修复受损的Windows引导MBR
- Evaluate Reverse Polish Notation
- android 开发相关资料
- [SqlServer01]-数据库表及数据操作控制
- 32位和64位系统区别及int字节数
- Error creating bean with name 'UserManger' defined in class path resource [user/applicationContext.x
- 【LeetCode】Clone Graph 解题报告
- 小度路由刷openwrt
- Mina的入门(一)
- wxWidgets 自定义事件触发