码迷,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
迷上了代码!