• 四则运算表达式求值——中缀表达式转后缀及计算


    http://acm.zjnu.edu.cn/DataStruct/showproblem?problem_id=1004

    题解:表达式计算 书上的模板

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<string>
    #include<string.h>
    #include<stack>
    #include<iostream>
    #include<list>
    using namespace std;
    const int maxn = 1e5 + 5;
    stack<char>opr;
    list<char> ans;
    stack<int>num;
    
    int cal(int aa, char o, int bb) {
        int a = aa;
        int b = bb;
        switch (o) {
        case'/':return a / b;
        case'*':return a*b;
        case'-':return a - b;
        case'+':return a + b;
        }
    }
    string mp[7];
    //+-* / (  ) 
    //01234 5
    string ofrd = "+-*/()#";
    int id(char c) {
        return ofrd.find(c);
    }
    
    
    
    char cmp(char a, char b) {
        return mp[id(a)][id(b)];
    }
    string ex;
    int main() {
        mp[0] = mp[1] = ">><<<>>";
        mp[2] = mp[3] = ">>>><>>";
        mp[4] = "<<<<<=>";
        mp[5] = ">>>> >>";
        mp[6] = "<<<<< =";
        while (cin >> ex) {
            ex += '#';
            //ex = '#' + ex;
            while (!opr.empty())opr.pop();
            while (!num.empty())num.pop();
            ans.clear();
            int len = ex.length();
            int i = 0;
            opr.push('#');
            while (ex[i] != '#' || opr.top() != '#') {
                if (ex[i] >= '0'&&ex[i] <= '9') { num.push(ex[i] - '0'); ans.push_back(ex[i]); i++; }
                else {
                    switch (cmp(opr.top(), ex[i])) {
                    case'<':
                        opr.push(ex[i]);
                        i++;
                        break;
                    case'=':
                        opr.pop();
                        i++;
                        break;
                    case'>':
                        char c = opr.top();
                        opr.pop();
                        int  a = num.top(); num.pop();
                        int b = num.top(); num.pop();
                        ans.push_back(c);
                        a = cal(b, c, a);
                        
                        num.push(a);
    
    
                        break;
                    }
                }
            }
            cout << ans.front(); ans.pop_front();
            for (auto t : ans)cout<< ' ' << t ;
            cout << endl;
            cout << num.top() << endl; num.pop();
        }
    
    }
     
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    服务器做系统备份时失败
    PHPMailer中文乱码问题的解决方法
    html字符串分行显示
    Oracle中取某几个数的最大值最小值
    分布式事务之 Seata
    org.apache.dubbo 2.7.7 服务端处理请求及时间轮(失败重试)
    org.apache.dubbo 2.7.7 服务消费源码
    org.apache.dubbo 2.7.7 服务发布注册源码
    org.apache.dubbo 2.7.x 再聚首
    spring-cloud-gateway 服务网关
  • 原文地址:https://www.cnblogs.com/SuuT/p/8921467.html
Copyright © 2020-2023  润新知