[Leetcode]Basic Calculator

Implement a basic calculator to evaluate a simple expression string.

The expression string may contain open ( and closing parentheses ), the plus + or minus sign -, non-negative integers and empty spaces .

You may assume that the given expression is always valid.

Some examples:

"1 + 1" = 2
" 2-1 + 2 " = 3
"(1+(4+5+2)-3)+(6+8)" = 23

Note: Do not use the eval built-in library function.

class Solution {
public:
    /*algorithm: stack soluton
        two stack: operand stack, and operator stack
        transform it to reverse polish notation,then compute
        but we can skip this step
        one pass
    */
    void tryExecute(stack<int>&opStk,stack<int>&numStk){
        if(numStk.size() < 2 || opStk.empty())return;
        int op = opStk.top();
        if(op =='+' || op == '-'){
            int r = numStk.top();numStk.pop();
            int l = numStk.top();numStk.pop();
            numStk.push(op == '+'?(l+r):(l-r));
            opStk.pop();
        }
    }
    int numLength(string &s,int start){
        int i = start;
        for(;i < s.size() && isdigit(s[i]);i++);
        return i - start;
    }
    int calculate(string s) {
        stack<int>opStk,numStk;
        int next;
        for(int i = 0;i < s.size();){
            char c = s[i];
            next = i + 1;
            if(c == '(')opStk.push(c);
            else if(c == ')'){
                opStk.pop();
                tryExecute(opStk,numStk);
            } else if(c == '+' || c == '-') opStk.push(c);
            else if(isdigit(c)){
                int len = numLength(s,i);
                numStk.push(stoi(s.substr(i,len)));
                tryExecute(opStk,numStk);
                next = i + len;
            }
            //update i pos
            i = next;
        }
        return numStk.top();
    }
};



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值