【leetcode】224. 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.



思路:设计两个栈number、symbol,number用来存数字,symbol用来存符号('+' '-' '(' ')')

逻辑如下:输入为一个字符串s,对于一个字符s[i]

(1)如果s[i]是空格,就i++

(2)如果s[i]是数字,计算出数字是多少(注意多位数的情况),然后将数字放入number中

(3)如果s[i]是'+' 或者 '-',判断symbol的栈顶是否是'+' 或者 '-',如果是就先计算,然后再将s[i]添加进symbol

(4)如果s[i]是'(',直接添加进symbol

(5)如果s[i]是')',计算直到symbol中遇到'(',弹出'('


c++代码(26ms)

class Solution {
public:
    int calculate(string s) {
        int len=s.size();
        stack<int> number;  //存储数字
        stack<char> symbol;  //存储运算符号:+ - ( )
        int i=0;
        while(i<len){
            if(s[i] == ' '){
                //如果是空格
                i++;
                while(i<len && s[i] == ' ')
                    i++;
            }else if(s[i] >= '0' && s[i] <= '9'){
                //如果是数字,注意要考虑多位数
                int tmp=s[i] - '0';
                i++;
                while(i<len && s[i] >= '0' && s[i] <= '9'){
                    tmp=tmp*10+(s[i]-'0');
                    i++;
                }
                number.push(tmp);
            }else if(s[i] == '+' || s[i] == '-'){
                if(!symbol.empty() && symbol.top() == '+'){
                    int tmp2 = number.top();
                    number.pop();
                    int tmp1 = number.top();
                    number.pop();
                    number.push(tmp1 + tmp2);
                    symbol.pop();  //弹出'+'
                    symbol.push(s[i]);  //加入新符号
    
                }else if(!symbol.empty() && symbol.top() == '-'){
                    int tmp2 = number.top();
                    number.pop();
                    int tmp1 = number.top();
                    number.pop();
                    number.push(tmp1 - tmp2);
                    symbol.pop();  //弹出'-'
                    symbol.push(s[i]);   //加入新符号
    
    
                }else{
                    symbol.push(s[i]);
                }
                i++;
    
            }else if(s[i] == '('){
                symbol.push(s[i]);
                i++;
            }else if(s[i] == ')'){
                //计算,直到遇到'('
                if(symbol.top() == '+'){
                    int tmp2 = number.top();
                    number.pop();
                    int tmp1 = number.top();
                    number.pop();
                    number.push(tmp1 + tmp2);
                    symbol.pop();  //弹出'+'
                    symbol.pop();  //弹出'('
                }else if(symbol.top() == '-'){
                    int tmp2 = number.top();
                    number.pop();
                    int tmp1 = number.top();
                    number.pop();
                    number.push(tmp1 - tmp2);
                    symbol.pop();  //弹出'-'
                    symbol.pop();  //弹出'('
                }else{
                    symbol.pop();  //弹出'('
                }
                i++;
            }
        }//for
        if(!symbol.empty()){
            int tmp2 = number.top();
            number.pop();
            int tmp1 = number.top();
            number.pop();
            if(symbol.top() == '+'){
                return tmp1 + tmp2;
            }else{
                return tmp1 - tmp2;
            }
        }
        return number.top();
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值