• 蓝桥杯ALGO-156 中缀表达式求值


    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T419

    将中缀表达式通过栈转换为后缀表达式

    #include<iostream>
    #include<sstream>
    #include<string>
    #include<stack>
    #include<vector>
    using namespace std;
    
    bool higher(char a, char b)
    {
        if (b == '(' || b == ')')
            return 1;
    
        if (a == '*' || a == '/')
            if (b == '+' || b == '-')
                return 1;
    
        return 0;
    }
    void stack_vec(stack<char>&s, vector<string>&suffix)
    {
        string str;
        str += s.top();
        suffix.push_back(str);
        s.pop();
    }
    int main()
    {
        string nifix;
        stack<char>s;
        vector<string>suffix;
    
        cin >> nifix;
        for (int i = 0; i < nifix.size(); i++)
        {
            if (nifix[i] >= '0'&&nifix[i] <= '9')
            {
                string str;
                while (nifix[i] >= '0'&&nifix[i] <= '9')
                {
                    str += nifix[i];
                    i++;
                }
                i -= 1;
                suffix.push_back(str);
            }
            else if (nifix[i] == '+' || nifix[i] == '-' || nifix[i] == '*' || nifix[i] == '/')
            {
                if (s.empty())
                    s.push(nifix[i]);
                else
                {
                    if (higher(nifix[i], s.top()))
                        s.push(nifix[i]);
                    else
                    {
                        while (!s.empty() && !higher(nifix[i], s.top()))
                            stack_vec(s, suffix);
                        s.push(nifix[i]);
                    }
                }
            }
            else if (nifix[i] == '(' || nifix[i] == ')')
            {
                if (nifix[i] == '(')
                    s.push(nifix[i]);
                else
                {
                    while (s.top() != '(')
                        stack_vec(s, suffix);
                    s.pop();
                }
            }
        }
        while (!s.empty())
            stack_vec(s, suffix);
    
        stringstream ss;
        stack<int>ca;
        int x,x1,x2;
    
        for (int i = 0; i < suffix.size(); i++)
        {
            if (suffix[i] == "+" || suffix[i] == "-" || suffix[i] == "*" || suffix[i] == "/")
            {
                x2 = ca.top();
                ca.pop();
                x1 = ca.top();
                ca.pop();
                switch (suffix[i][0])
                {
                    case '+':x = x1 + x2; break;
                    case '-':x = x1 - x2; break;
                    case '*':x = x1 * x2; break;
                    case '/':x = x1 / x2; break;
                    default:break;
                }
                ca.push(x);
            }
            else
            {
                ss << suffix[i];
                ss >> x;
                ca.push(x);
                ss.clear();
            }
        }
        cout << ca.top();
        //system("pause");
        return 0;
    }
  • 相关阅读:
    HDU 4489 The King’s Ups and Downs (DP+数学计数)
    HDU 2084 数塔 (水DP)
    CodeForces 706C Hard problem (水DP)
    CodeForces 706B Interesting drink (二分查找)
    CodeForces 706A Beru-taxi (数学计算,水题)
    HDU 4438 Hunters (数学,概率计算)
    机器学习-基础知识
    如何学习-学习理论(A-1)-KOLB学习周期理论
    如何学习-辅助工具
    如何学习-入门之后
  • 原文地址:https://www.cnblogs.com/NDKY9/p/8016683.html
Copyright © 2020-2023  润新知