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

来源:互联网 发布:保湿水推荐 知乎 编辑:程序博客网 时间:2024/05/21 17:37

  中缀式转后缀式

     栈当中只保存了操作符

      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


原创粉丝点击