题解 | #表达式求值#

表达式求值

https://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

#include <cctype>
#include <iostream>
#include <map>
#include <string>
#include <unordered_map>
#include <stack>
using namespace std;

unordered_map<char,  int> m{
    {'#',0},{'$',1},{'(',1},{'+',2},{'-',2},{'*',3},{'/',3}
};

int calculate(int a,int b,char c);
string preprocess(string &str1);

int main() 
{
    string m_expresion;
    while(cin>>m_expresion)
    {
        m_expresion=preprocess(m_expresion);
        m_expresion.push_back('$');
        stack<char> ops;ops.push('#');
        stack<int> nums;
        string donum;
        for(int i=0;i<m_expresion.size(); )
        {
            if(isdigit(m_expresion[i]))
            {
                donum.push_back(m_expresion[i]);
                ++i;
            }
            else 
            {
                if(donum!="")
                {
                    nums.push(stoi(donum));
                    donum="";
                } 
                if(m_expresion[i]==')')
                {
                        if(ops.top()!='(')
                        {
                            int nums2=nums.top();nums.pop();
                            int nums1=nums.top();nums.pop();
                            char op=ops.top();ops.pop();
                            int ans=calculate( nums1, nums2, op);
                            nums.push(ans);
                        }
                        else 
                        {
                            ++i;
                            ops.pop();
                        }
                }
                else if(m_expresion[i]=='(')
                {
                    ops.push('(');
                    ++i;
                }
                else if(m[ops.top()]<m[m_expresion[i]])   
                    {
                    ops.push(m_expresion[i]);
                    ++i;
                    }
                else 
                    {
                        int nums2=nums.top();nums.pop();
                        int nums1=nums.top();nums.pop();
                        char op=ops.top();ops.pop();
                        int ans=calculate( nums1, nums2, op);
                        nums.push(ans);
                    }
            }
        }
        cout<<nums.top();
    
    }
}


int calculate(int a,int b,char c)
{
    switch(c)
    {
        case '+':
            return a+b;
        case '-':
            return a-b;
        case '*':
            return a*b;
        case '/':
            return a-b;
    }
    return 0;
}

string preprocess(string &str1)
{
    if(str1[0]=='-')
    {
        str1="0"+str1;
    }
    for(int i=1;i<str1.size();++i)
    {
        if(
            str1[i-1]=='('&&
            str1[i]=='-'
            )
        {
            str1.insert(i,1,'0');
        }
    }
    return str1;

}




// 64 位输出请用 printf("%lld")

全部评论

相关推荐

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

创作者周榜

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