leetcode 224 基本计算器

题面就是实现一个字符串输入的加减法计算器(带括号),注意一元的减号是会出现的,且字符串中有空格
思路就是使用两个栈,一个储存数字和计算结果,另外一个存运算符。
基本步骤

  • 删去括号
  • 如果遇到')'就开始计算直到前一个左括号,运算顺序是先出栈的放在后面

遇到的坑

  • 减号的优先级是高的,所以遇到减号要直接计算
  • 在将字串转化成数字时要先算s[i]-'0',否则可能会超出int范围
  • 最简单的处理方法就是在每个新操作前把能算的都算完

tips
为了处理方便,可以在一元'+' 和'-'前面push(0)

具体代码

class Solution {
public:
void cal(stack<int>& numbers, stack<char>& operators){
if(numbers.size()<2||operators.empty()) return;
int num1, num2;
char op;
op=operators.top();
operators.pop();
num2=numbers.top();
numbers.pop();
num1=numbers.top();
numbers.pop();
if(op=='+'){numbers.push(num1+num2);}
else if(op=='-'){numbers.push(num1-num2);}
}
void replace_space(string& s){
int pos=s.find(" ");
while(pos!=-1){
s.replace(pos,1,"");
pos=s.find(" ");
}
}
int calculate(string s) {
stack<int> numbers;
stack<char> operators;
if(s[0]=='-'||s[0]=='+') numbers.push(0);
int num = 0;
replace_space(s);
for (int i = 0; i < s.length();i++) {
if (s[i] >= '0' && s[i] <= '9') {
int number=0;
int j=i;
while(j<s.length()&&s[j]>='0'&&s[j]<='9'){
number=number*10+s[j]-'0';
j++;
}
numbers.push(number);
i=j-1;
}
else if(s[i]==')'){
while(!operators.empty()){
char op=operators.top();
if(op!='(')
cal(numbers,operators);
else{
operators.pop();
break;
}
}
}
else if(s[i]=='(') operators.push(s[i]);
else{
if(i>0&&(s[i-1]=='('||s[i-1]=='+'||s[i-1]=='-')) numbers.push(0);
while (!operators.empty()&&operators.top()!='(')
{
cal(numbers,operators);
}
operators.push(s[i]);
}
}
while(!operators.empty()){
cal(numbers,operators);
}
return numbers.top();
}
};
posted @   oxidationreaction  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示