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

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


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

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

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

二.实现原理

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

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

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

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

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

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

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

三.C++实现

#include<iostream>
#include<stack>
#include<string>
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<char> 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语言描述》P52-P56;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值