力扣224. 基本计算器
224. 基本计算器
224. 基本计算器
难度:困难
描述:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval() 。
示例 1:
输入:s = "1 + 1"
输出:2
示例 2:
输入:s = " 2-1 + 2 "
输出:3
示例 3:
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
代码
class Solution {
public:
unordered_map<char,int>oper_pri={
{'+',1},
{'-',1},
{'*',2},
{'/',2}
}; //确定操作符优先级
stack<long long>nums;
stack<char>oper;
int calculate(string s) {
int n=s.size();
nums.push(0); //防止为这样的式子-3+2
for(int i=0;i<n;i++)
{
//从左向右遍历式子,可能为数字,操作符,空格,( ,或 )
//情况一 为数字
if(s[i]>= '0'&&s[i]<='9')
{
int t=i;
while (i+1<n&&s[i+1]>='0'&&s[i+1]<='9') //可能不是10以内的数,如27
{
i++;
}
nums.push(stoll(s.substr(t,i-t+1)));
}
//情况二 为空格则直接跳过
else if(s[i]==' ')
{
continue;
}
//情况三 为( 可能为(-3+7)则在-前加0变为(0-3+7)
else if(s[i]=='(')
{
oper.push(s[i]);
if(s[i+1]=='-'||s[i+1]=='+')
{
nums.push(0);
}
else{
continue;
}
}
//情况四 为)
else if(s[i]==')')
{
while(oper.top()!='(')
{
operater();
}
oper.pop();
}
//情况五 为其他操作符时,要判断操作符优先级,进行出栈运算
else {
while(!oper.empty()&&oper.top()!='('&&oper_pri[oper.top()]>=oper_pri[s[i]])
{
operater();
}
oper.push(s[i]);
}
}
//整个式子遍历完后对nums和oper两个栈进行计算
while(!oper.empty()&&oper.top()!='(')
{
operater();
}
return nums.top();
}
void operater(){
long long a=nums.top();nums.pop();
long long b=nums.top();nums.pop();
char op=oper.top();oper.pop();
long long ans;
switch(op)
{
case '+':ans=b+a;break;
case '-':ans=b-a;break;
case '*':ans=b*a;break;
case '/':ans=b/a;break;
}
nums.push(ans); //计算出的数再进栈
}
};

浙公网安备 33010602011771号