码迷,mamicode.com
首页 > 其他好文 > 详细

ALGO-156

时间:2017-12-10 14:34:35      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:switch   stream   for   i++   题目   har   pid   pop   bool   

题目链接: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;
}

 

ALGO-156

标签:switch   stream   for   i++   题目   har   pid   pop   bool   

原文地址:http://www.cnblogs.com/NDKY9/p/8016683.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!