将中缀表达式转换为后缀表达式(c++)

描述

在日常应用中,算术表达式中运算符总是出现在两个操作数之间,例如5(7-23)+8/2,这种形式称为中缀表达式。计算一个中缀表达式需要知道运算符的优先级和结合性。乘除是高优先级,加减是低优先级,优先级相同时他们都是左结合的,也就是从左计算到右。有括号就要计算括号内的表达式。

中缀表达式利于人的理解,但不便于计算机的处理。因此需要将中缀表达式转换成后缀表达式,以方便计算机处理。所谓后缀表达式就是将运算符放在运算数之后。后缀表达式也称为逆波兰表达式。

比如:

中缀表达式为:1+(2-3)*4+4/2

对应后缀表达式为:1 2 3 - 4 * + 4 2 / +

现在请你编写一个程序,将输入的中缀表达式转换为后缀表达式。

输入描述

输入为一行字符串,包含一个中缀表达,运算符合操作数之间无空格。输入表达式中包含+、-、*、/、^(求次幂)5种运算。

输出描述

输出为一行字符串,为输入的后缀表达式,操作数和运算符之间用空格分隔。

用例输入 1

1+(2-3)*4+4/2

用例输出 1

1 2 3 - 4 * + 4 2 / +

c++ AC代码:

#include<bits/stdc++.h>
using namespace std;
char youxianji(char c)
{
    if (c=='+' || c=='-') return 1;
    if (c=='*' || c=='/') return 2;
    else if (c=='^') return 3;
    return 0;
}
int main()
{
    string a;
    cin>>a;
    stack<char> li;
    string s="";
    for (int i=0;i<a.size();i++)
    {
        char c=a[i];
        if (c>='0' && c<='9') s+=c;
        if (i!=a.size()-1)
        {
            if (a[i+1]=='+' || a[i+1]=='-' || a[i+1]=='*' || a[i+1]=='/' || a[i+1]=='^' || a[i+1]==')')
            {
                if (s!="")
                {
                    cout<<s<<" ";
                    s="";
                }
            }
        }
        if (c=='(') li.push(c);
        else if (c==')')
        {
            while (!li.empty() && li.top()!='(')
            {
                cout<<li.top()<<" ";
                li.pop();
            }
            li.pop();
        }
        else if (c=='+' || c=='-' || c=='*' || c=='/' || c=='^')
        {
            while (!li.empty() && (youxianji(li.top())>=youxianji(c)))
            {
                cout<<li.top()<<" ";
                li.pop();
            }
            li.push(c);
        }
    }
    if (s!="") cout<<s<<" ";
    while (!li.empty())
    {
        cout<<li.top()<<" ";
        li.pop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值