题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/c215ba61c8b1443b996351df929dc4d4

经典的中缀表达式求值。常用思路,将其转为后缀表达式,边转边求值。
后缀表达式的特点,遇到运算符则将前两个数拿出来运算,便于计算机计算。
这里简单描述一下算法过程:遍历字符串,当读到的是数字时,直接将其压入数字栈。当读到的是运算符时,若符号栈为空,则直接将其压入符号栈;若符号栈非空,则判断符号栈栈顶的运算符优先级,若其优先级大于等于读到的优先级,则将其出栈,并从数字栈弹出两个元素进行该运算,先弹出的为右操作数,后弹出的为左操作数,将结果压入数字栈。重复该操作,直到符号栈栈顶运算符的优先级小于读取的运算符,或符号栈空,则将读取的运算符压入符号栈。重复以上操作直到字符串读完。最后,若符号栈非空,则弹出栈顶元素,并从数字栈弹出两个元素来进行该运算。重复该操作直到符号栈空。弹出数字栈栈顶元素,即得结果。
注:本题中运算符优先级:')'<'+'='-'<'*'。左括号'('较为特殊,读到左括号时直接入栈,读到右括号时一直出栈直到一个左括号出栈。
最初遇到两个坑。一个是在判断运算符出栈条件时,优先级相等的运算符未出栈。这样就造成中缀表达式变为右结合,当算式运算中一直大于等于0时不会出现问题,而当其中出现负数减法时就会出错。如1-2-3,正常情况下左结合结果为-4,而右结合得到的结果时2。另一个坑是在遍历字符串数组时,最开始惯性思维默认了表达式中数字都是个位数,所以循环中每次仅读入1个字符。而提交的用例中有100+100的例子,这样数字栈就变成了先压入1,再压入0...最后改写了读入数据的逻辑,美中不足的是这样做会在循环体内改变循环控制变量i,容易出错。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    int solve(string s) {
        // write code here
        stack<char> sign;
        stack<int> num;
        for(int i = 0;i<s.length();i++){
            if(s[i] >= '0' && s[i] <= '9'){
                int rear = i;
                while((rear+1)<s.length() && s[rear+1] >= '0' && s[rear+1] <= '9'){
                    rear++;
                }
                int n = 0;
                for(int j=rear;j>=i;j--){
                    n += (s[j]-'0')*pow(10,(rear-j));
                }
                i = rear;
                num.push(n);
            }
            else if(sign.size() == 0 || s[i] == '*'|| s[i] == '('){
                sign.push(s[i]);
            }
            else if(s[i] == '+' || s[i] == '-'){
                while(1){
                    if(sign.size() == 0){
                        break;
                    }
                    if(sign.top() == '*'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1*n2);
                    }
                    else if(sign.top() == '+'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1+n2);
                    }
                    else if(sign.top() == '-'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1-n2);
                    }
                    else{
                        break;
                    }
                }
                sign.push(s[i]);
            }
            else if(s[i] == ')'){
                while(1){
                    if(sign.size() == 0){
                        break;
                    }
                    else if(sign.top() == '('){
                        sign.pop();
                        break;
                    }
                    else if(sign.top() == '+'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1+n2);
                    }
                    else if(sign.top() == '-'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1-n2);
                    }
                    else if(sign.top() == '*'){
                        sign.pop();
                        int n2 = num.top();
                        num.pop();
                        int n1 = num.top();
                        num.pop();
                        num.push(n1*n2);
                    }
                }
            }
        }
        while(sign.size()!=0){
            if(sign.top() == '+'){
                sign.pop();
                int n2 = num.top();
                num.pop();
                int n1 = num.top();
                num.pop();
                num.push(n1+n2);
            }
            else if(sign.top() == '-'){
                sign.pop();
                int n2 = num.top();
                num.pop();
                int n1 = num.top();
                num.pop();
                num.push(n1-n2);
            }
            else if(sign.top() == '*'){
                sign.pop();
                int n2 = num.top();
                num.pop();
                int n1 = num.top();
                num.pop();
                num.push(n1*n2);
            }
        }
        return num.top();
    }
};
全部评论

相关推荐

就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
陆续:不可思议 竟然没那就话 那就我来吧 :你是我在牛客见到的最美的女孩
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务