表达式转换(25 分)(栈的应用)

  中缀式转后缀式

     栈当中只保存了操作符

      1.如果遇到操作数,直接输出。

      2.如果遇到操作符,则将其压入到栈中,遇到左括号时也将其压入栈中。
      3.如果遇到一个右括号,则依次将栈顶元素弹出,并输出,直到遇到左括号为止。注意,左括号只弹出并不输出。
      4.如果遇到任何其他的操作符,如("+", "*","(")等,从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。
         弹出完这些元素后,才将遇到的操作符压入到栈中。有一点需要注意,只有在遇到" ) "的情况下才弹出" ( ",其他情况都不会弹出" ( "。
      5.弹出运算符时,遵循优先级高的优先弹出。在左括号压栈之前,其优先级最高,压栈之后,其优先级最低。

      6.如果我们读到了输入的末尾,则将栈中所有元素依次弹出。

注意:

  1. 由于遇到运算数便立即输出了,所以栈当中便只保存了操作符,那么只需要判断其优先级从而确定输出的顺序即可
  2. 运算数可能是正整数,负整数,小数(正负)
  3. 负号只能是出现在开头或者是在中间的某一个'('之后

表达式转换(25 分)

 

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

2 3 7 4 - * + 8 4 / +

 

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void print(){
    static int flag = 0;
    if(flag)  putchar(' ');
    flag++;
}
int main(){
    char stack[50];
    char str[50];
    scanf("%s", str);
    int len = strlen(str);
    int top = 0;//压栈之后top++,所以每一次top都是栈顶的下一个位置

    for(int i = 0; i<len; i++){
        //处理运算数(此处的+ -表示正负,而非加减
        if((str[i] == '+' || str[i] == '-') && (!i || str[i - 1] == '(') || (str[i] >= '0' && str[i] <= '9')){
            print();
            if(str[i] != '+')   putchar(str[i]);
            while(str[i + 1] == '.' || (str[i + 1] >= '0' && str[i + 1] <= '9'))
                putchar(str[++i]);
        }
        else{
            //处理运算符
            if(str[i] == ')'){//遇到右括号,则需要将左括号前的运算符全部弹栈输出
                while(top && stack[top-1] != '('){
                    print();
                    putchar(stack[--top]);
                }
                //如果栈不为空
                if(top)  --top;  //左括号只弹栈,不输出
            }
            else{
                if(!top){   //栈为空,无须比较,直接压栈
                    stack[top++] = str[i];
                    continue;
                }
                //根据优先级顺序,压栈||(弹栈后压栈)
                while(top && stack[top-1] != '('){
                    //比较优先级,如果str[i]的优先级大于栈顶运算符的优先级,直接压栈
                    if(str[i] == '(' || ((str[i] == '*' || str[i] == '/') && (stack[top-1] == '-' || stack[top-1] == '+')))
                        break;
                    print();
                    //如果str[i]的优先级小于栈顶的优先级,弹栈,之后再把str[i]压栈
                    printf("%c", stack[--top]);
                }
                stack[top++] = str[i];
            }
        }
    }
    while(top){ //所有运算数均已操作完毕,最后将栈中剩余的操作符全部输出
        print();
        //左括号不输出
        if(stack[top-1] != '(')
            putchar(stack[--top]);
        else    top--;
    }

    return 0;
}

 

 

 

这个题被“=” 和“==”坑惨了o(╥﹏╥)o
 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值