Lintcode - Expression Evaluation
2015-07-05 15:28
218 查看
转自 : http://blog.csdn.net/nicaishibiantai/article/details/45740649
Given an expression string array, return the final result of this expression
Example
For the expression 2*6-(23+7)/(1+2)
,
input is
[
"2", "*", "6", "-", "(",
"23", "+", "7", ")", "/",
(", "1", "+", "2", ")"
],
return 2
Note
The expression contains only integer
, +
, -
, *
, /
, (
, )
.
一个很详细的解释:http://www.geeksforgeeks.org/expression-evaluation/ 比这道题还难点
思路就是两个stack,一个存数字一个存符号。如果遇到数字直接存到数字stack;如果遇到符号,有几种情况:
1.当前符号比上一个符号优先级高,比如* 高于+,那么直接进栈
2.当前符号低于上一个,那么就要把所有已经在stack里面优先于当前符号的全算完,再推进当前符号
3.当前符号是“(”,直接push
4.当前符号是“)”,就要把所有“(”以前的符号全部算完
public class Solution { /** * @param expression: an array of strings; * @return: an integer */ public int evaluateExpression(String[] expression) { // write your code here Stack<Integer> intStack = new Stack<Integer>(); Stack<String> opStack = new Stack<String>(); int cur = 0; while (cur < expression.length) { String curStr = expression[cur]; if (isOp(curStr)) { if (curStr.equals("(")) { opStack.push(curStr); } else if (curStr.equals(")")) { while (!opStack.peek().equals("(")) { intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop())); } opStack.pop(); } else { while (!opStack.isEmpty() && precedence(curStr, opStack.peek())) { intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop())); } opStack.push(curStr); } } else { intStack.push(Integer.valueOf(curStr)); } cur++; } while (!opStack.isEmpty()) { intStack.push(calc(intStack.pop(), intStack.pop(), opStack.pop())); } return intStack.isEmpty() ? 0 : intStack.pop(); } int calc(int a, int b, String op) { if (op.equals("+")) { return a + b; } else if (op.equals("-")) { return b - a; } else if (op.equals("*")) { return a * b; } else { return b/a; } } boolean isOp(String str) { if (str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/") || str.equals("(") || str.equals(")")) { return true; } else { return false; } } // if b takes precedence over a boolean precedence(String a, String b) { if (b.equals("*") || b.equals("/")) { return true; } if (b.equals("+") || b.equals("-")) { if(a.equals("*") || a.equals("/")) { return false; } else { return true; } } return false; } };
相关文章推荐
- tolua++实现分析
- Lua脚本语法说明(转)
- Lua的特点
- Lua学习
- HDU 1202 The cacluation of GPA
- 图像检索评估准则——Evaluation Criteria of Image Retrieval : Retrieval Accuracy
- 【本·伍德Lua专栏】补充的基础06:简单的错误处理
- notepad++ 查找引用(Find Reference)(适用于c c++及各类脚本比如lua、python等)
- tolua 有些功能可以用(经过测试)
- Lua的线程和状态
- luasocket系列之winsocket基础补充—winsock库1
- Ngx_Lua使用分享
- ngx映射到lua模块函数变量一览
- Lua移植到arm上 并实现在arm上 可以让lua脚本调c语言,C语言调用lua脚本
- Weka开发[3]-Evaluation类
- Lua与C的交互
- Lua基本语法
- lua程序设计下载
- lua库
- lua传"值"和传"引用"