60行c++简单实现中缀表达式转后缀

版权声明:请注明转载地址 https://blog.csdn.net/OCEANtroye https://blog.csdn.net/OCEANtroye/article/details/83315355

中缀表达式转后缀表达式算法


使用栈进行辅助
对于符号±/(),定义为/优先级为2,’(’(左括号)优先级为3,右括号’)'优先级最低为0

对于一个表达式

如果当前字符为数字:
    输出到输出队列中;
否则当前字符是运算符号或者括号时候:
    while 当前优先级大于栈顶优先级并且栈不空:
         栈顶元素出栈加入到输出队列中;
    将元素压入栈内;
 while 当前栈非空:
     出栈返回栈顶元素;

对于左右括号问题

把左括号定义为 压入前是最高的优先级 压入后是最低优先级
这样一旦遇到左括号一定能被压入,并且压入后等级是最低的
定义右括号为第二低低的优先级 这样它就可以 一直pop栈元素
然后等遇到左括号 (左括号这个时候是最低的优先级)的时候
pop左括号


源码

#include <iostream>
#include <stack>
#include <cctype>
#include <map>
using namespace std;
int main(int argc, char const *argv[])
{
    map<char, int> ss;
    ss['+'] = 1;
    ss['-'] = 1;
    ss['*'] = 2;
    ss['/'] = 2;
    stack<char> s;
    string express;
    while (cin >> express)
    {
        for (int i = 0; i < express.length(); i++)
        {
            if (isalpha(express[i]))
            {
                cout << express[i] << " ";
            }
            else if (express[i] == '(')
            {
                s.push(express[i]);
            }
            else if (express[i] == ')')
            {
                while (s.top() != '(')
                {
                    cout << s.top() << " ";
                    s.pop();
                }
                s.pop();
            }
            //*/优先级高因此栈的栈顶是优先级高的
            else
            {
                //cout << express[i];
                // 当前栈顶的元素优先级大于当前零时字符
                while (!s.empty() && ss[s.top()] >= ss[express[i]])
                {
                    cout << s.top() << " ";
                    s.pop();
                }

                s.push(express[i]);
            }
        }
        while (!s.empty())
        {
            cout << s.top() << " ";
            s.pop();
        }
        cout << endl;
    }
    system("pause");

    return 0;
}


运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/OCEANtroye/article/details/83315355