224. 基本计算器
给你一个字符串表达式 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*1e5
· s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成
· s 表示一个有效的表达式
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/basic-calculator
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码
class Solution {
public:
int calculate(string s) {
typedef long long LL;
stack<LL>nums;
stack<char>sign;
char record[s.size()+10];
int count=0;
for(int i=0;i<s.size();i++)//用一个数组来记录没有空格的表达式
if(s[i]!=' ')record[count++]=s[i];
LL temp=0;
int flag=1;
for(int i=0;i<count;i++)
{if(record[i]=='('&&nums.empty())continue;//如果一开始就是括号,直接跳过
if(record[i]=='-'&&record[i+1]=='('&&i==0){sign.push(record[i]);
continue;}
if(record[i]=='-'&&i==0){flag=-1;continue;}
if(record[i]>='0'&&record[i]<='9'){while(record[i]>='0'&&record[i]<='9'){
temp=temp*10+(record[i]-'0');
i++;}
i=i-1;
nums.push(temp*flag);
flag=1;
temp=0;}
//如果符号后面跟着的是括号,则先不计算,把符号压入栈
if((record[i]=='+'||record[i]=='-')&&record[i+1]=='(')sign.push(record[i]);
//如果符号后面是数字,则可以直接计算
if((record[i]=='+'||record[i]=='-')&&record[i+1]!='(') {
int a=nums.top();
char sign1=record[i];
nums.pop();
int b=0;
while(record[i+1]>='0'&&record[i+1]<='9'){
b=b*10+(record[i+1]-'0');
i++;}
if(sign1=='+')a=a+b;
else a=a-b;
nums.push(a);
continue;
}
//如果当前读到右括号,则可以把符号栈中的符号弹出一个计算
if(record[i]==')'&&!sign.empty()){
int sign2=sign.top();
sign.pop();
int a=nums.top();
nums.pop();int b;
if(!nums.empty()){ b=nums.top();
nums.pop();}
else b=0;
if(sign2=='+')a=a+b;
else a=b-a;
nums.push(a);
}
} return nums.top();
}
};