逆波兰表达式计算加减乘除

输入
复制
“(2*(3-4))*5”
返回值
复制
-10

算法思路

1.用栈保存各部分计算的和
2.遍历表达式
3.遇到数字时继续遍历求这个完整的数字的值
4.遇到左括号时递归求这个括号里面的表达式的值
5.遇到运算符时或者到表达式末尾时,就去计算上一个运算符并把计算结果push进栈,然后保存新的运算符
如果是+,不要计算,push进去
如果是-,push进去负的当前数
如果是×、÷,pop出一个运算数和当前数作计算
6.最后把栈中的结果求和即可



class Solution {
    stack<int> num;
    stack<char> sig;
    int com(int a,int b,char x) {
        if (x=='+') return a+b;
        if (x=='*') return a*b;
        if (x=='-') return a-b;
        if (x == '/' && b) return a/b;
        return -9999999;
    }
    void calc() {
        int b = num.top();  num.pop();
        int a = num.top();  num.pop();
        char op = sig.top();sig.pop();
        num.push (com(a,b,op));
        
        
    }
    void changes(string s) {
        for (int i=0;i<s.size() ;++i) {
            if (s[i] == '-') {
                // 0 - num;
                if (i==0) s.insert(i,0);
                if (i>0 && s[i-1] == '(') s.insert(i,"0");
            }
        }
        return;
    }
    
    
    
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        if (s.empty()) return -1;
        changes(s);
        for (int i=0;i<s.size() ;++i) {
            char e = s[i];
            if (e>='0' && e<='9' && i<s.size()) {
                //开始扫描
                int j = i;
                int temp = 0;
                while (s[j] <='9' && s[j] >='0' && j<=s.size()) {
                    temp = temp*10 +(s[j]-'0');
                    ++j;
                }
                num.push(temp);
                i = j-1;
                
            }else  {
                char e = s[i];
                if (e=='(' || sig.empty()) {
                    sig.push(e);
                }
                else{
                    if (s[i] =='+' || s[i] == '-') {
                        while (sig.size() && sig.top()!='('){
                            calc();
                        }
                        sig.push(s[i]);
                    }
                    if (s[i]=='*' || s[i] =='/') {
                        // 要和栈前面的进行计算
                        while(sig.size() && (sig.top()=='*'||sig.top()=='/')) calc();
                        sig.push(s[i]);
                    }
                    if (s[i] ==')') {
                        while (sig.size() && sig.top() !='(' ){
                            calc();
                        }
                        sig.pop();
                    }
                }
            }
        }
        while (sig.size()) calc();
        return num.top();
        
    }
};

















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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值