题目描述
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值
样例
示例 1:
输入:s = “1 + 1”
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23
思路
一开始想的是用两个栈,把中缀表达式转化成后缀表达式来做,写了一点发现好像没这个必要,这个题目中的符号只有 ‘+’ 和 ‘-’,因此,只有判断每个数的最终符号是正还是负就可以了。
这里直接参考官方题解啦~官方的大概思路是,遍历字符串,用一个栈维护当前位置的符号,遍历碰到不同的字符时操作也不同。
奉上传送门:
-224. 基本计算器官方题解
代码
class Solution {
public int calculate(String s) {
Stack <Integer> sign = new Stack<Integer>();
//一开始是正号
sign.push(1);
int now = 1;
int result = 0;
int i = 0;
while(i < s.length()) {
//空格不管
if(s.charAt(i) == ' ') {
i++;
}
//如果碰到'+',那么当前符号和之前的符号是一致的
else if(s.charAt(i) == '+'){
now = sign.peek();
i++;
}
//如果碰到'-',那么当前符号和之前的符号是相反的
else if(s.charAt(i) == '-') {
now = -sign.peek();
i++;
}
//如果碰到'('那么将'('前面的符号属性保存在栈中
else if(s.charAt(i) == '(') {
sign.push(now);
i++;
}
//如果碰到')',则将之前保存的符号属性从栈中弹出
else if(s.charAt(i) == ')') {
sign.pop();
i++;
}
//如果是数字
else {
int num = 0;
while(i < s.length() && Character.isDigit(s.charAt(i))) {
num = num*10 + (s.charAt(i)-'0');
i++;
}
result += num*now;
}
}
return result;
}
}