224-基本计算器_讨论帖

浅羽技术
浅羽网络工作室官方账号
2022-07-02 00:29:09

解题思路
这道题的字符串只包含加减法和括号,思路比较明确,打算用栈去解决这类问题,当遇到括号的时候将括号入栈,如果括号前是减号,则括号内部的加减法需要进行反转,遇到另一半括号的时候则出栈,思路清晰,代码如下:

class Solution {
public:
int calculate(string s) {
stack stk;//记录括号影响
stk.push(1);
int n=s.size();
int symbol=1;//加上括号影响的加减
int i=0;
int ret=0;//返回值
while(i<n){
if(s[i]==' ') i++;
else if(s[i]=='+'){
symbol=stk.top();
i++;
}
else if(s[i]=='-'){
symbol=-stk.top();//对当前符号进行翻转
i++;
}
else if(s[i]=='('){
stk.push(symbol);
i++;
}
else if(s[i]==')'){
stk.pop();
i++;
}
else{
long num=0;
while(i<n&&s[i]>='0'&&s[i]<='9'){
num=num10+(int)(s[i]-'0');
i++;
}
ret=ret+symbol
num;
}
}
return ret;
}

};
代码执行结果

其他思路
这道题一开始是想用递归的思路去进行求解,当遇到括号的时候对括号内部表达式进行优先运算,但是考虑到这道题只包含了加减法,括号展开后依然是从左往右进行运算,所以直接用对符号进行操作就可以求解了,在这放上题解中运用递归思路实现计算器的代码供参考学习:

class Solution {
public:
//递归程序一定要按照自然的(目标的)顺序去写
//先有数 然后左括号(递归数完了用符号)
// 然后符号 然后右括号
int calculate(string s) {
int i=0;
return helper(s,i);
}
int helper(string s,int &i){
stack st;
char sign='+'; //第一次为正,要把数字放进去
int num=0; //当前的计算值
int pre=0; //用于计算乘除时保存前面的值
for(;i<s.size();i++){
if(isdigit(s[i])) { //碰到数字了
if(s[i]==' ') s[i]=0;
num=10num+(s[i]-'0'); //当前为数字,注意是字符类型
}
if(s[i]=='('){
num=helper(s,++i);//下一个数字开始递归
i++; //递归结束在')' 要i++
}
if((!isdigit(s[i])&&(s[i]!=' '))||i==s.size()-1){
//空格不算 s[i]!=' ',当s[i]==')'时进入if因为要把num压入栈
switch(sign){ //上面的num算出来要push
case '+': st.push(+num); break;
case '-': st.push(-num); break;
case '
':
pre=st.top();
st.pop();
st.push(pre*num);
break;
case '/':
pre=st.top();
st.pop();
st.push(pre/num);
break;
}
num=0;
sign=s[i];// 更新sign,为了下一次的保存与计算
}
if(s[i]==')') break; 统计完才能跳出循环,不可放到前面的位置
}
int result=0; //累计当前栈的结果
while(!st.empty()){
result=result+st.top();
st.pop();
}
return result;
}
};

作者:ChrisWangInChina
链接:https://leetcode-cn.com/problems/basic-calculator/solution/li-yong-gua-hao-de-di-gui-di-gui-jie-jue-txlc/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
总结
做完昨天的每日一题还和同学交流了计算器的简易实现,今天的每日一题就直接安排上了,解题思路很多,在用自己的方法实现时候应该多看看其他人的思路,估计明天就是带上乘除法的计算器了?

...全文
11 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-Java 发布问题, 以便更快地解决您的疑问

3

社区成员

发帖
与我相关
我的任务
社区管理员
  • community_1934
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧