题解 | #表达式求值#

表达式求值

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

#include <stack>
#include <cstring>
#include <string>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */

    bool equal(char a,stack<char> &temp4)
    {
        if(a=='+'||a=='-')
        {
            if(temp4.top()=='+'||temp4.top()=='-')
                return true;
            else
                return false;;
        }
        else
        {
            if(temp4.top()=='*'||temp4.top()=='/')
                return true;
            else
                return false;;
        }
    }
     bool lower(char a,stack<char> &s_temp)
     {
        if (a=='*' || a=='/') {
            return false;
        }
        else {
            if(s_temp.top()=='+' || s_temp.top()=='-')
            {
                return false;
            }
            else {
                return true;
            }
        }
     }

     void calc(stack<int>&num_temp,stack<char>s_temp)
     {
        int temp2 = num_temp.top();
        num_temp.pop();
        int temp1 = num_temp.top();
        num_temp.pop();
        switch (s_temp.top()) {
        case '+':num_temp.push(temp1+temp2);break;
        case '-':num_temp.push(temp1-temp2);break;
        case '*':num_temp.push(temp1*temp2);break;
        case '/':num_temp.push(temp1/temp2);break;
        default:break;
        }
     }
    int solve(string s) {
        // write code here
        stack<int> num;
        stack<char> oper;
        string temp3;
        int length = s.length();
        for(int i=0;i<length;i++)
        {
            if(s[i]=='('||s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/' ||s[i]==')')
            {
                if(!oper.empty() && lower(s[i],oper) &&s[i]!='('&&s[i]!=')')
                {
                    while (!oper.empty() && oper.top()!='(') {
                        calc(num,oper);
                        oper.pop();
                    }
                    oper.push(s[i]);
                }//上面代码计算的是优先级情况
                
                else if (!oper.empty()&&s[i]!='('&&s[i]!=')'&&equal(s[i],oper)) {
                    calc(num, oper);
                    oper.pop();
                    oper.push(s[i]);
                }//此段代码计算的是优先级相同

                else if (s[i]==')') {
                    while (oper.top()!='(') {
                        calc(num,oper);
                        oper.pop();
                    }
                    oper.pop();
                }//此段代码计算的右括号端,该段没有push操作,因为不讲右括号入栈

                else {
                    oper.push(s[i]);
                }//其他情况运算法正常入栈
            }
            else
            {
                while (s[i]!='('&&s[i]!='+'&&s[i]!='-'&&s[i]!='*'&&s[i]!='/' && s[i]!=')'&&i<length) {
                    temp3+=s[i];
                    i++;
                }//获得大于一位的数字并入栈
                num.push(stoi(temp3));
                temp3={};
                i--;
            }
            if(i==length-1 && !oper.empty())
            {
                calc(num, oper);
                oper.pop();
            }//如果到最后操作符栈还没空时,则将操作符全部执行

        }
        //
        return num.top();
    }
};

全部评论

相关推荐

02-11 17:47
已编辑
门头沟学院 Java
神哥不得了:神哥来啦~建议先在网上找一些高频的八股去背,然后再去广泛的背八股,这样的学习会更有效率一些,简历的这两个项目建议换掉,换成两个高质量的项目,这样的话获得面试的比例会更高一点,专业技能的话排版要注意一下,要加句号的话就都加,要不加就都不加,荣誉奖项的话写在教育经历里边吧,这个确实没有太多的含金量
点赞 评论 收藏
分享
2024-12-27 23:45
已编辑
三江学院 Java
程序员牛肉:死局。学历+无实习+项目比较简单一点。基本就代表失业了。 尤其是项目,功能点实在是太假了。而且提问点也很少。第一个项目中的使用jwt和threadlocal也可以作为亮点写出来嘛?第二个项目中的“后端使用restful风格”,“前端采用vue.JS”,“使用redis”也可以作为亮点嘛? 项目实在是太简单了,基本就是1+1=2的水平。而你目标投递的肯定也是小厂,可小厂哪里有什么培养制度,由于成本的问题,人家更希望你来能直接干活,所以你投小厂也很难投。基本就是死局,也不一定非要走后端这条路。可以再学一学后端之后走测试或者前端。 除此之外,不要相信任何付费改简历的。你这份简历没有改的必要了,先沉淀沉淀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务