/*
224. 基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 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 表示一个有效的表达式
'+' 不能用作一元运算(例如, "+1" 和 "+(2 + 3)" 无效)
'-' 可以用作一元运算(即 "-1" 和 "-(2 + 3)" 是有效的)
输入中不存在两个连续的操作符
每个数字和运行的计算将适合于一个有符号的 32位 整数
*/
class Solution {
public:
int calculate(string s) {
stack<int> ope;
ope.push(1);
int oper = 1;
int tmpResult = 0;
int i = 0;
int n = s.length();
while (i < n) {
if (s[i] == ' ') i++;
else if (s[i] == '+') {
oper = ope.top();
i++;
}
else if (s[i] == '-') {
oper = -ope.top();
i++;
}
else if (s[i] == '(') {
ope.push(oper);
i++;
}
else if (s[i] == ')') {
ope.pop();
i++;
}
else {
long int numCur = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
numCur = numCur * 10 + s[i]-'0';
i++;
}
tmpResult += numCur * oper;
}
}
return tmpResult;
}
};
// 8 ms + 7.9 MB 抄标准参考答案的代码,思路为每次遇到+、-运算符时判断它要不要变号,其中借助括号和栈去记录括号前负号的作用域。
class Solution {
public:
int calculate(string s) {
stack<char> ope;
stack<int> num;
//num.push(0);
int tmpResult = 0;
int i = 0, n = s.length();
while (i < n) {
if (s[i] == ' ')i++;
else if (s[i] == '+' || s[i] == '-') {
if (!ope.empty() && ope.top() != '(') {
if (ope.top() == '+') {
tmpResult += num.top();
num.pop();
tmpResult += num.top();
num.pop();
ope.pop();
}
else if (ope.top() == '-') {
tmpResult -= num.top();
num.pop();
tmpResult += num.top();
num.pop();
ope.pop();
}
num.push(tmpResult);
tmpResult = 0;
ope.push(s[i]);
}
else if (num.empty()) {
num.push(0);
ope.push(s[i]);
}
else {
ope.push(s[i]);
}
i++;
}
else if (s[i] == '(') {
ope.push(s[i]);
i++;
}
else if (s[i] == ')') {
if (ope.top() == '(') {
ope.pop();
}
else {
if (ope.top() == '+') {
tmpResult += num.top();
num.pop();
tmpResult += num.top();
num.pop();
ope.pop();
}
else if (ope.top() == '-') {
tmpResult -= num.top();
num.pop();
tmpResult += num.top();
num.pop();
ope.pop();
}
ope.pop();
num.push(tmpResult);
tmpResult = 0;
}
i++;
}
else {
long int tmpNum = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
tmpNum = tmpNum * 10 + s[i] - '0';
i++;
}
num.push(tmpNum);
}
}
while (!ope.empty() && !num.empty()) {
if (ope.top() == '+') {
tmpResult += num.top();
num.pop();
if (!num.empty())tmpResult += num.top();
ope.pop();
num.pop();
}
else if (ope.top() == '-') {
tmpResult -= num.top();
num.pop();
if (!num.empty())tmpResult += num.top();
ope.pop();
num.pop();
}
}
if (!num.empty()) tmpResult += num.top();
return tmpResult;
}
};
// 写不下去了: 暂时debug进度: "1-(-2)"无法处理,会报错
// 总结: 还是得用"判断+、-是否需要变号"那个思路
leetcode写题笔记 -- 基本计算器
于 2022-03-27 12:03:40 首次发布