Lintcode: Expression Evaluation (Basic Calculator III)
Given an expression string array, return the final result of this expression Have you met this question in a real interview? Yes
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, +, -, *, /, (, ).
这道题其实应该算Basic Calculator III. 参考了http://blog.csdn.net/nicaishibiantai/article/details/45740649
思路就是两个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> integers = new Stack<Integer>();
Stack<String> ops = new Stack<String>();
int i = 0;
while (i < expression.length) {
String cur = expression[i];
if (isOp(cur)) { // current string is an op
if (cur.equals("(")) ops.push(cur);
else if (cur.equals(")")) {
while (ops.size()>0 && !ops.peek().equals("(")) {
integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
}
ops.pop();
}
else { // +,-,*,/
while (ops.size()>0 && precede(cur, ops.peek())) {
integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
}
ops.push(cur);
}
}
else integers.push(Integer.parseInt(cur)); // current String is an integer, push to integer stack
i++;
}
while (!ops.isEmpty()) {
integers.push(calc(integers.pop(), integers.pop(), ops.pop()));
}
return integers.isEmpty()? 0 : integers.pop();
}
public boolean isOp(String input) {
if (input.equals("+") || input.equals("-") || input.equals("*")
|| input.equals("/") || input.equals("(") || input.equals(")"))
return true;
return false;
}
public 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;
}
public boolean precede(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; //case like (a+b) 到第一个+号时,+和(比应该return false
}
};
Lintcode: Expression Evaluation (Basic Calculator III)的更多相关文章
- [LeetCode] Basic Calculator III 基本计算器之三
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- [LeetCode] 772. Basic Calculator III 基本计算器之三
Implement a basic calculator to evaluate a simple expression string. The expression string may conta ...
- 【leetcode】Basic Calculator III
题目如下: Implement a basic calculator to evaluate a simple expression string. The expression string may ...
- leetcode 772.Basic Calculator III
这道题就可以结合Basic Calculator中的两种做法了,分别是括号运算和四则运算的,则使用stack作为保持的结果,而使用递归来处理括号内的值的. class Solution { publi ...
- LintCode "Expression Evaluation"
This is sth. for me to learn.. https://github.com/kamyu104/LintCode/blob/master/C++/expression-evalu ...
- Basic Calculator I && II && III
Basic Calculator I Implement a basic calculator to evaluate a simple expression string. The expressi ...
- Basic Calculator - Stack(表达式计算器)
978. Basic Calculator https://www.lintcode.com/problem/basic-calculator/description public class Sol ...
- [LeetCode] Basic Calculator IV 基本计算器之四
Given an expression such as expression = "e + 8 - a + 5" and an evaluation map such as {&q ...
- [LeetCode] Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
随机推荐
- laravel 数据填充
编写填充器 php artisan make:seeder UserTableSeeder 修改Laravel安装时自带的DatabaseSeeder类,添加一个数据库插入语句到run方法: < ...
- cookie 操作
//创建并赋值 重新赋值也是这样操作 document.cookie="userId=828"; document.cookie="userName=hulk" ...
- Xlib 窗口属性
Xlib 窗口属性 转, 无法找到原作者 所有的 InputOutput 窗口都可以有零个或者多个像素的边框宽度,一个可选的背景,一个事件压制掩码(它压制来自孩子的事件传播),和一个 property ...
- Reactor 与 Proactor
一.五种IO Model blocking IO nonblocking IO IO multiplexing signal driven IO(不常用) asynchronous IO 对于一个ne ...
- 软件的NABCD----安装部分
N:需求 有些软件安装需要很多的插件,很很多的安装步骤,甚至文件夹移动等麻烦的步骤 A:做法 做成一键安装的程序 B:好处 默认D盘安装,节省C盘空间,没有赘余插件,一键安装,省时省力. C:竞争 和 ...
- NodeJS模块的使用
在NodeJS中,每个js文件就是一个模块,而文件路径就是模块名, 在编写每个模块时,都有require.exports.module三个预先定义好的变量可供使用. require函数用于在当前模块中 ...
- JNI字段描述符(转)
转载自http://fgsink.blog.163.com/blog/static/16716997020124310169911/ “([Ljava/lang/String;)V” 它是一种对函数返 ...
- MVC在VIEW中动态控制htmlAttributes和routevalues的方法
在项目中有一个Html.DropDownListFor放在一个分部视图中,然后调用这个分部视图时需要动态控制这个DropDownList的显示方式,比如宽度.是否禁用.是否列表等,这些值的设置都在Ht ...
- svn out of date
out of date说明这个文件过期了,也就是已经有过一次提交的版本,当前提交的版本号小于当前的版本. 解决办法:先将文件update一下,然后再提交.
- Selenium2学习-037-WebUI自动化实战实例-IE浏览器显示比例问题:org.openqa.selenium.remote.SessionNotFoundException: Unexpected error launching Internet Explorer. Browser zoom level was set to 94%. It should be set to 100%
好久没有写博文了,今天在给部门新人演示 Selenium WebDriver 启动其支持的各种浏览器时,启动 IE 时总是无法打开对应的百度网址,页面如下所示: