SDUT OJ 2132 (一般算术表达式转换成后缀式)

题目描述

Description

对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之

Input

输入一个算术表达式,以‘#’字符作为结束标志

Output

输出该表达式转换所得到的后缀式

Sample

Input

a*b+(c-d/e)*f#

Output

abcde/-f+

转换规定

从左到右遍历中缀表达式的每个符号和字母(数字),若是字母(数字)就输出,即成为后缀表达式的一部分;若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号(乘除优先加减)则栈顶元素依次出找并输出,并将当前符号进栈,一直到最终输出后缀表达式为止

总结

+ - 进栈时,栈中元素弹出直到遇到 停止弹出。
但有两点需要注意:

+ - 需要进栈且 不出栈 。
不进栈且 出栈。

* / 进栈只弹 * /

代码如下

#include<iostream>
#include<stack>
using namespace std;

const int N = 1e2 + 10;

char c[N], ch[N], s[N];  //s[N] 栈
int cnt, top;

void stackway()
{
    cnt = 0;
    for (int i = 0; ch[i] != '#'; i++)
    {

        if (ch[i] >= 'a' && ch[i] <= 'z')
        {
            c[cnt++] = ch[i];
            continue;
        }
        else
        {
            if (ch[i] == '+' || ch[i] == '-' || ch[i] == ')') // + - ) 进栈
            {
                while (top)
                {
                    char j = s[top--];
                    if (j == '(')   // 遇到 (停止弹出
                    {
                        top++;
                        break;
                    }
                    c[cnt++] = j;
                }
                if (ch[i] == ')') top--;  // )不进栈
                else
                    s[++top] = ch[i];
                continue;
            }
            else
            {
                if (ch[i] == '*' || ch[i] == '/')  // * / 进栈
                {
                    while (1)
                    {
                        if (s[top] == '*' || s[top] == '/')  // 只弹 * /
                        {
                            c[cnt++] = s[top--];
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                s[++top] = ch[i];
                continue;
            }
        }
    }
    while (top) //栈中剩余元素输出
    {
        c[cnt++] = s[top--];
    }
}


int main()
{
    while (1)
    {
        cin >> ch[cnt++];
        if (ch[cnt - 1] == '#') break;
    }
    stackway();
    for (int i = 0; i < cnt; i++)
        cout << c[i];
    cout << endl;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值