中序表达式向后序表达式的转换(c++实现)

中序表达式向后序表达式的转换(c++实现)


一.中序表达式和后序表达式

    中序表达式:就是我们学习中经常看到的表达式:6*(5+(2+3)*8+3)=288;

    后序表达式:也叫逆波兰表达式,这是计算机处理表达式的方式。

二.实现原理

    1.当读取的是操作数时,直接放置到输出;

    2.当读取的是操作符时,不直接放置到输出,必须先存放在某个地方(实际上为栈),然后进行优先级的比较:

        如果该操作符的优先级比栈顶的要高,那么就入栈;

        如果该操作符的优先级没有栈顶的高,那么栈顶的操作符就出栈,再接着比较当前栈顶操作符的优先级当          前操作符的优先级......

    3.如果读取到的操作符为“(”,那么直接入栈;

    4.如果读取到的操作符为“)”,那么从栈弹出操作符,并写入输出,直到遇到“(”,“(”和“)”不写入到输出;

    5.当输入为空时,将栈中的全部操作符弹出并写入到输出中。

三.C++实现

#include
#include
#include
using namespace std;
int priority(char ch)
{
    if (ch == '*' || ch == '/')
        return 1;
    if (ch == '+' || ch == '-')
        return 0;
    if (ch == '(')
        return -1;
}
int main()
{
    string input = "1+2*3+(4*5+6)*7";         //待处理中序表达式
    string output;
    stack st;
    for (const auto &p : input)
    {
        if (p == '+' || p == '-' || p == '*' || p == '/' || p == '(')       
        {
            if (p == '(')
                st.push(p);
            else
            {
                while ((!st.empty())&&(priority(p) <= priority(st.top())))
                {
                    output += st.top();
                    st.pop();
                }
                st.push(p);
            }
        }
        else if (p == ')')                                                  
        {
            while (st.top()!= '(')
            {
                output += st.top();
                st.pop();
            }
            st.pop();
        }
        else                         //如果是操作数,直接输入到输出
            output += p;
    }
    while (!st.empty())
    {
        output += st.top();
        st.pop();
    }
    cout << output << endl;
    return 1;
}

中序表达式向后序表达式的转换(c++实现)_第1张图片

四.参考

    《数据结构与算法分析-C语言描述》P52-P56;

你可能感兴趣的:(C++)