从中缀向后缀转换表达式(C语言)

问题描述

  中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式

(A 一 (B*C 十 D)*E) / (F 十 G )

转换为后缀表示为:ABC*D十E*--FG十/

注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算,要注意运算符的结合性),可以处理圆括号 (),并假定输入的算术表达式正确。

要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束

输入:

整数N。表示下面有N个中缀表达式
N个由单个字母和运算符构成的表达式

输出:

N个后缀表达式。

样例

输入(1)
1
(A-(B*C+D)*E)/(F+G)#

输出(1)

ABC*D+E*-FG+/

输入(2)

2
a+b*c-d#
a-b*(c+d)#

输出(2)

abc*+d-
abcd+*-
代码
#include <iostream>
#include <stack>
#include <string>
using namespace std;

stack<char> s;

int main()
{
    int N;
    cin >> N;
    while (N--)
    {
        string in;
        cin >> in;
        int t = 0;
        while (in[t] != '#')
        {
            if (t == 0 && in[t] == '-')
            {
                cout << in[t];
            }
            else if (isalnum(in[t]))
            {
                cout << in[t];
            }
            else if (in[t] == '(')
            {
                s.push(in[t]);
            }
            else if (in[t] == ')')
            {
                while (s.top() != '(')
                {
                    cout << s.top();
                    s.pop();
                }
                s.pop();
            }
            else if (in[t] == '-' && (in[t - 1] == '(' || in[t - 1] == '*' || in[t - 1] == '/' || in[t - 1] == '%' || in[t - 1] == '+' || in[t - 1] == '-'))
            {
                cout << in[t];
            }
            else
            {
                if (s.empty())
                {
                    s.push(in[t]);
                }
                else
                {
                    int x, y;
                    while (1)
                    {
                        if (s.empty())
                        {
                            s.push(in[t]);
                            break;
                        }

                        char chtmp = s.top();
                        switch (in[t])
                        {
                            case '^': x = 7; break;
                            case '*': x = 4; break;
                            case '/': x = 4; break;
                            case '+': x = 2; break;
                            case '-': x = 2; break;
                        }
                        switch (chtmp)
                        {
                            case '^': y = 6; break;
                            case '*': y = 5; break;
                            case '/': y = 5; break;
                            case '(': y = 1; break;
                            case '+': y = 3; break;
                            case '-': y = 3; break;
                        }

                        if (y >= x)
                        {
                            cout << chtmp;
                            s.pop();
                            continue;
                        }
                        else
                        {
                            s.push(in[t]);
                            break;
                        }
                    }
                }
            }
            t++;
        }
        while (!s.empty())
        {
            cout << s.top();
            s.pop();
        }
        cout << endl;
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值