LeetCode #224 基本计算器——每日一题

224. 基本计算器

实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。

先附上一个大佬的做法,两个栈一个记录数字,一个记录左括号前面的符号F,这样当遇到右括号的时候直接将栈顶的值加上F*括号内的值,很简便的做法

class Solution {
     public int calculate(String s) {
        int ans=0;
        char[] str=s.toCharArray();
        int len=str.length;
        Stack<Integer> st_num=new Stack<>();
        Stack<Integer> st_signs=new Stack<>();
        int sign=1;//正负号,运算符号
        for(int i=0;i<len;i++){
            if(str[i]==' ') continue;
            if(str[i]=='+'||str[i]=='-') sign=str[i]=='+'? 1:-1;
            else if(str[i]>='0'&&str[i]<='9'){//数字
                int num=str[i]-'0';
                while(i<len-1&&str[i+1]>='0'&&str[i+1]<='9'){//将这个数字找完
                    num=num*10+(str[++i]-'0');
                }
                ans+=sign*num;
            }else if(str[i]=='('){//左括号,暂存结果
                st_num.push(ans);
                st_signs.push(sign);
                ans=0;
                sign=1;
            }
            else ans=st_num.pop()+ans*st_signs.pop();//右括号更新结果
        }
        return ans;
    }
}

作者:CYINGENOHALT
链接:https://leetcode-cn.com/problems/basic-calculator/solution/shuang-zhan-shuang-90-by-cyingenohalt-eoy3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

示例 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 * 105
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式

这道题wa了很多次,还有很多点没有想到,导致代码改的很乱。

主要的几个测试点有

-(2+1)

-(-2+1)

(1-(6-7)+2)

12+15

我基本上就是对几个方法特判或者特殊处理下。

主要思路先把空格去了,然后用两个栈来维护算式情况,当遇到右括号两个栈都应该退栈到左括号并计算括号里面的

然后模拟就好了

class Solution {
public:
    int calculate(string s) {
        int len = s.size();
        string str = "";
        for(int i =0 ;i<len;i++){
            if(s[i]!=' ') str+=s[i];
        }
        s = str;
        len = str.size();
        stack<long long> sta_int;
        stack<char> sta_char;
        int ffff = 1;
        int flag = 0;
        int fz = 1,i = 0;
        if(len>2&&s[0]=='-'&&s[1]=='('){
            ffff =-1;
            i = 1;
        }
        for(;i < len; i++){
            if(s[i]>='0'&&s[i]<='9'){
                long long temp = 0;
                int j = i;
                for(;j<len;j++){
                    if(!(s[j]>='0'&&s[j]<='9')){
                        break;
                    }
                    temp = temp * 10 + s[j] - '0';
                }
                if(sta_int.size()==0)
                    sta_int.push(temp*fz);
                else sta_int.push(temp);
                if(j==len) break;
                else i = j - 1;
            }else{
                if(s[i]=='+'&&sta_int.size()==0){
                    continue;
                }
                if(s[i]=='-'&&sta_int.size()==0){
                    fz = -1;
                    continue;
                }
                if(s[i]==')'){
                    while(sta_char.top()!='('){
                        char fuhao = sta_char.top();
                        int num = sta_int.top();
                        sta_char.pop();
                        sta_int.pop();
                        int sign = 1;
                        if(sta_char.size()){
                            sign = sta_char.top()=='-'?-1:1;
                             if(sta_char.top()!='(')sta_char.top() = '+';
                        }   
                        if(fuhao=='+') sta_int.top() = sign * sta_int.top() + num;
                        if(fuhao=='-') sta_int.top() = sign * sta_int.top() - num;
                    }
                    sta_char.pop();
                }
                else sta_char.push(s[i]);
            }
        }
        while(sta_char.size()){
            char fuhao = sta_char.top();
            int num = sta_int.top();
            sta_char.pop();
            sta_int.pop();
            int sign = 1;
            if(sta_char.size()){
                sign = sta_char.top()=='-'?-1:1;
                if(sta_char.top()!='(')sta_char.top() = '+';
            }
            if(fuhao=='+') sta_int.top() = sign * sta_int.top() + num;
            if(fuhao=='-') sta_int.top() = sign * sta_int.top() - num;
        }
        return sta_int.top()*ffff;
    }
};

数值。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值