leetcode面试题-16.26 计算器
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/calculator-lcci
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
解答:
class Solution {
public int calculate(String s) {
HashMap<String,Integer> map = new HashMap<>();
map.put("+", 1);
map.put("-", 1);
map.put("*", 2);
map.put("/", 2);
Deque<Integer> nums = new LinkedList<>();
Deque<String> ops = new LinkedList<>();
for (int i = 0; i < s.length(); i++) {
String tmp = s.substring(i,i+1);
if (" ".equals(tmp)) {
continue;
}
else if (!map.containsKey(tmp)) {
int j = i;
while (j < s.length() && Character.isDigit(s.charAt(j))) {
j++;
}
tmp = s.substring(i, j);
nums.push(Integer.parseInt(tmp));
i = j-1;
} else {
while (true) {
if (ops.isEmpty()||map.get(ops.peek()) < map.get(tmp)) {
ops.push(tmp);
break;
}
int v2 = nums.pop();
int v1 = nums.pop();
nums.push(exec(ops.peek(),v1,v2));
ops.pop();
}
}
}
while (!ops.isEmpty()) {
String op = ops.pop();
int v2 = nums.pop();
int v1 = nums.pop();
nums.push(exec(op, v1, v2));
}
return nums.pop();
}
public int exec(String op, int v1, int v2) {
switch(op) {
case "+":
return v1+v2;
case "-":
return v1-v2;
case "*":
return v1*v2;
default:
return v1/v2;
}
}
}