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(); } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理