- 基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
示例 1:
输入:s = “1 + 1”
输出:2
示例 2:
输入:s = " 2-1 + 2 " 输出:3
示例 3:
输入:s = “(1+(4+5+2)-3)+(6+8)”
输出:23
提示:
1 <= s.length <= 3 * 105
s 由数字、'+'、'-'、'('、')'、和 ' ' 组成
s 表示一个有效的表达式
class Solution {
public int calculate(String s) {
int num = 0, sign = 1, res = 0; //分别代表:右侧数字,中间符号,左侧数字
Deque<Integer> stack = new ArrayDeque(); // stack中存放左侧数字和中间运算符,
//中间运算符表示右侧数字的正负值
for (char ch : s.toCharArray()) {
if (ch == ' ') continue;
if(ch <= '9' && ch >= '0') {
num = num * 10 + ch - '0';
}
if (ch == '+' || ch == '-') {
res += sign * num; // res开始计算,此时的sign是前一个数字num的符号,不是当前ch
sign = ch == '+' ? 1 : -1;
num = 0; // 遇到符号需要初始化
}
if (ch == '(') { // 将所有左侧数字计算出,用res和sign表示
stack.push(res);
stack.push(sign);
//初始化res和sign,(前面不可能是数字,所以num一定是为0
res = 0;
sign = 1;
}
if (ch == ')') {
res += num*sign; //res 为当前括号中的计算和
res = res * stack.pop() + stack.pop();
sign = 1; //sign初始化为1
num = 0;
}
}
res += num*sign; // 当表达式最后一个为纯数字时,需要增加一步计算
return res;
// // 先将字符串格式化
// StringBuilder sb = new StringBuilder();
// char cur = s.charAt(0);
// if (cur == '+' || cur == '-') sb.append("0");
// char former = s.charAt(1);
// for (int i = 2; i < s.length(); i++) {
// cur = s.charAt(i);
// if(former == '(' && (cur == '+' || cur == '-')) {
// sb.append("0");
// former = cur;
// }
// sb.append(cur);
// }
// s = sb.toString();
// int res = 0;
// Deque<String> stack = new ArrayDeque();
// int tmp = 0;
// for (char ch : s.toCharArray()) {
// if (ch == ' ') continue;
// if (isNum(ch)) {
// tmp = tmp*10 + ch - '0';
// } else { // 如果是运算符或者括号
// if (ch == '+' || ch == '-') {
// stack.push(tmp);
// stack.push(ch);
// tmp = 0;
// } else { // 如果是括号
// if (ch == '(') stack.push(ch);
// if (ch == ')') {
// }
// }
// }
// }
}
}