题解 | #表达式求值#

表达式求值

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

代码说话:双栈的思路
我觉得精解的双栈思路有点复杂,简化一下:
分模块:1.处理数字
2.遇到‘(’时要进行的操作是将其放入操作符栈,然后确认下一个符号位是不是为负号,是则将0先压入数据栈,再将负号压入操作符栈
3.遇到‘)’时计算栈内所有的东西,直到遇到左括号为止
4.当遇到其他操作符时,先判断当前的操作符是否小于栈顶的操作符,如果是,那么此时则需要将栈的结果计算后,重新放入栈中,同样的,当前的操作符仍需入栈
举例:2*3 - 4,符号的优先级低于*,所以此时要将2*3优先计算出来,然后将数字6放入数据栈中,同时操作符‘-’也要入栈。
5.最后返回栈顶的值即可
注:只有在遇到左括号以及加减乘除的操作符时才有可能调用计算函数,不然的话暂时不需要计算
class Solution {
public:
    map<char, int> m_map  = {{'-', 1},{'+', 1},{'*', 2},{'/', 2},{'%', 2}};
    stack<char> stack1;//存放特殊操作符
    stack<int> stack2;//存放数字
    void cal()
    {
        //处理边界条件
        if(stack2.empty() || stack2.size() < 2) return ;
        if(stack1.empty()) return;
        long int res;
        char s = stack1.top(); stack1.pop();
        int a = stack2.top();stack2.pop();
        int b = stack2.top();stack2.pop();
        switch(s)
        {
            case '-': res = b - a;break;
            case '+': res = b+a;break;
            case '*': res = a*b;break;
            case '/': res = b/a;break;
        }
        stack2.push(res);
    }
    int solve(string s) {
        //同一级可以直接算,遇到括号后的第一个运算符可以先补0;
        int temp = 0;
        stack2.push(0);
        for(int i = 0; i < s.size(); i++)
        {             if(isdigit(s[i]))
            {
                temp = 10*temp + (s[i] - '0');
                while(i + 1<s.size() && isdigit(s[i+1]))
                {
                    i++;
                    temp = 10*temp + (s[i] - '0');
                }
                stack2.push(temp);
                temp = 0;
            }
            else if('(' == s[i])
            { 
                stack1.push(s[i]);
                if(i + 1<s.size() && '-' == s[i+1])
                {
                    stack2.push(0);
                    stack1.push('-');
                    i++;
                }
            }
            else if(')' == s[i])
            {
                //开始计算栈内的东西,直到遇到了‘)’,如何处理优先级的问题
                while(stack1.top() != '(')
                {
                    cal();
                }
                stack1.pop();
            }
            else if('+' == s[i] ||'-' == s[i] || '*' == s[i] || '/' == s[i])
            {
                //在这里把能算的都算进去,TBD
                while(!stack1.empty() && stack1.top() != '(' && m_map[s[i]] <= m_map[stack1.top()])
                {
                    cal();
                }
                stack1.push(s[i]);                
            }
            else{}
        }
        while(!stack1.empty()) cal();
        return stack2.top();
    }
};


#神仙公司的日常##哔哩哔哩实习##涂鸦智能实习#
全部评论

相关推荐

不愿透露姓名的神秘牛友
05-26 15:37
1、这群人晚上&nbsp;11&nbsp;点发朋友圈:"凌晨&nbsp;11&nbsp;点,三环的灯还亮着。"&nbsp;实际下班时间:19:30。2、什么是嘉豪呀?我最近在字节实习,没什么时间上网3、同龄人:学校社团、酒吧蹦迪;我:acm、字节/腾讯实习4、别人朋友圈发:“今天不想上课”;我朋友圈发:“今天的班就上到这里啦”,定位:字节跳动5、别人的朋友圈都是到处旅游的定位,我的朋友圈天天都是“字节定位”,还一定要是在【公司的健身房】里拍张照片,实际只练了10分钟,其中凹造型5分钟6、mentor布置任务的时候,别人都是:”好的收到“,我:”是不是要xxxx,xxxx这么做也可以吧,这个技术方案会不会更好些“7、别人书包里装的:王道408、轻薄本、四六级真题。我书包里面装的:显存24GB4090独显gpu(24小时开机运行,屏幕上贴着“字节/腾讯等贴纸”)、速效救心丸(代码报错用)、电棍(熬夜写代码困了用),就很……你们懂吧8、入职大厂第一件事:发朋友圈、发小红书,晒工牌,985计算机硕|字节实习生|可以接咨询|有偿改简历,9、别人的社交软件简介:25岁|男|希望遇见有趣的灵魂;嘉豪的社交软件简介:25岁|程序员|字节跳动工程师|一张佩戴工牌的自拍照大厂嘉豪标配:1.&nbsp;挂胸前的工牌(地铁里只挂不收,怕你看不见&nbsp;logo)2.&nbsp;降噪耳机(不放音乐也戴着,避免别人跟自己说话)3.&nbsp;印&nbsp;logo&nbsp;的电脑包(字节红&nbsp;/&nbsp;腾讯蓝&nbsp;/&nbsp;阿里橙&nbsp;/&nbsp;美团黄)4.&nbsp;手表(最好显示心率,午饭后必发"步数已破&nbsp;6,000")
牛客30247842...:因为不好进啊要是大厂随便进哪来这么多人装逼
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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