• 【map的实际应用,学习map,不用=白学】3302. 表达式求值【如何得到运算符优先级?自己过一遍示例即可明白】【怎么比较运算符的优先级?map】


    欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
    文章字体风格:
    红色文字表示:重难点
    蓝色文字表示:思路以及想法
     
    如果大家觉得有帮助的话,感谢大家帮忙点赞!收藏!转发!

    在这里插入图片描述

    1. 如何得到运算符优先级

    首先,我们要明白,当我们遍历表达式,有些时候,我们可能不会直接进行运算,而是看接下来是什么运算而进行运算,所以我们是需要存储之前我们已经遍历好的符号和数字的,所以我们想到了使用 两个栈存储 在需要的时候 表达式

    我们看示例
    1+2+3
    1+2*3
    遍历开始 得到1 + 2 之后遍历 到的两种情况分别为 + 或 *
    那么运算顺序就不一样,我们多试几个,就可以总结出

    (1)如果栈顶是+,即将入栈的是+,栈顶优先级高,需要先计算,再入栈;
    (2)如果栈顶是+,即将入栈的是*,栈顶优先级低,直接入栈;
    (3)如果栈顶是*,即将入栈的是+,栈顶优先级高,需要先计算,再入栈;
    (4)如果栈顶是*,即将入栈的是*,栈顶优先级高,需要先计算,再入栈;

    2. 怎么比较运算符的优先级?

    //unordered_map 有序,常用于查找
    
    unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };
    
    • 1
    • 2
    • 3

    h[‘运算符’] 这样就可以得到 该运算符的 具体大小

    #include 
    #include 
    #include 
    #include 
    using namespace std;
    
    stack<int> num;
    stack<char> op;
    
    //优先级表
    unordered_map<char, int> h{ {'+', 1}, {'-', 1}, {'*',2}, {'/', 2} };
    
    
    void eval()//求值
    {
        int a = num.top();//第二个操作数
        num.pop();
    
        int b = num.top();//第一个操作数
        num.pop();
    
        char p = op.top();//运算符
        op.pop();
    
        int r = 0;//结果 
    
        //计算结果
        if (p == '+') r = b + a;
        if (p == '-') r = b - a;
        if (p == '*') r = b * a;
        if (p == '/') r = b / a;
    
        num.push(r);//结果入栈
    }
    
    int main()
    {
        string s;//读入表达式
        cin >> s;
    
        for (int i = 0; i < s.size(); i++)
        {
            if (isdigit(s[i]))//数字入栈
            {
                int x = 0, j = i;//计算数字
                while (j < s.size() && isdigit(s[j]))
                {
                    x = x * 10 + s[j] - '0';
                    j++;
                }
                num.push(x);//数字入栈
                i = j - 1;
            }
            //左括号无优先级,直接入栈
            else if (s[i] == '(')//左括号入栈
            {
                op.push(s[i]);
            }
            //括号特殊,遇到左括号直接入栈,遇到右括号计算括号里面的
            else if (s[i] == ')')//右括号
            {
                while(op.top() != '(')//一直计算到左括号
                    eval();
                op.pop();//左括号出栈
            }
            else
            {
                while (op.size() && h[op.top()] >= h[s[i]])//待入栈运算符优先级低,则先计算
                    eval();
                op.push(s[i]);//操作符入栈
            }
        }
        while (op.size()) eval();//剩余的进行计算
        cout << num.top() << endl;//输出结果
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    机械设备制造企业如何借助ERP系统,解决成本核算难题?
    SSM计算机基础自学系统毕业设计-附源码221509
    插入排序.
    国庆作业 10月1 用select实现服务器并发
    如何调试一个C++程序?以Visual Studio 2019为例的保姆级教程。
    推荐,文本转图像,图像转图像运营再也不用担心配图了
    国内首款研发领域 AI 项目管理工具发布:PingCode AI
    【Ts】tsconfig.json、package.json、强制编译ts工程
    海量数据插入的各种方案试验
    WebService 生成客户端代码方法总结
  • 原文地址:https://blog.csdn.net/m0_63571404/article/details/127850402