表达式转换(中缀转后缀)

算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。

输入格式:

输入在一行中给出不含空格的中缀表达式,可包含+-*\以及左右括号(),表达式不超过20个字符。

输出格式:

在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。


输入样例:

2+3*(7-4)+8/4

输出样例:

2 3 7 4 - * + 8 4 / +

排坑样例

1+(-1*8)-5
1 -1 8 * + 5 -
(1+(-2+(+3-(-4))))
1 -2 3 -4 - + +
3.14159265359*+1+2*3
3.14159265359  * 1 + 2 3 * +
+1
1

考察 :  栈操作

注意 :  可能一开始就被括号包着

思路 :  

1. 遇到要输出的数字直接输出(正数不可带括号)
2. 遇到加减,栈顶弹出,直到遇见 '(' 或者 栈为空
3. 遇到乘除,栈顶弹出,直到遇见 '+'  '-'  '('  或者 栈为空
4. 遇到左括号需额外判断 (-1) 或者 (+1) 等情况
5. 遇到右括号, 栈顶弹出,直到遇见 左括号
6. 遇到运算符包括左括号,在执行完上述操作后需压入栈
7. 最后要清空栈


C/C++ 

#include<stdio.h>
int main()
{
    char str[201],stack[201];   // 输入字符 + 模拟栈
    int top=0,len=0;            // 栈高,
    gets(str);                  // 获取中缀表达式

    /*  开头符号判断  */
    if(str[0]=='+' || str[0]=='-') {
        if(str[0]=='-') putchar('-');
        len++;
    }

    /*  逐个字符判断  */
    while (str[len]!='\0'){
        char ch = str[len++];
        switch (ch) {
            case '(':
                // 遇到左括号,注意判断(-1)这种情况
                stack[++top] = '(';
                if(str[len]=='+') len++;
                if(str[len]=='-') printf("%c",str[len++]);
                break;
            case ')':
                // 弹出符号,直到遇见'('为止
                while (stack[top]!='(') printf(" %c",stack[top--]);
                top--;  // '(' 也要弹出
                break;
            case '+': case '-':
                putchar(' '); // 前置空格先输出
                // 弹出符号,直到遇到'('
                while (top!=0 && (stack[top]!='(')) printf("%c ",stack[top--]);
                // 将该符号压入栈
                stack[++top] = ch;
                break;
            case '*': case '/':
                putchar(' '); // 前置空格先输出
                // 只要栈顶是乘号或除号就弹出
                while (top!=0 && (stack[top]=='*' || stack[top]=='/')) printf("%c ",stack[top--]);
                // 将该符号压入栈
                stack[++top] = ch;
                break;
            default: putchar(ch); //数字部分遇见直接输出
        }
    }

    while (top>0) printf(" %c",stack[top--]); // 弹出剩余的运算符
    return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三块不一样的石头

十分满意,一分打赏~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值