7-4 表达式转换(25 point(s))(栈的应用)

来源:互联网 发布:哪个校音器软件好用 编辑:程序博客网 时间:2024/06/06 13:11

7-4 表达式转换(25 point(s))

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

输入格式:

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

输出格式:

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

输入样例:

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

输出样例:

2 3 7 4 - * + 8 4 / +有很多坑,看注释,而且题目有误,/是除号,而不是\code:
#include <stdio.h>#include <string.h>int main(){    char a[30];//输入字符串    char s[30];//代表储存运算符号的栈    int top = -1;    gets(a);    int i;    int flag = 0;//标记,看是不是第一个数字,是直接打出,不是先打出空格    for(i = 0; a[i]; i++){        if(a[i]>='0'&&a[i]<='9'){//如果是数字,直接打印出数字,包括多位的数字和小数            int j = i;//保存开头            while((a[i]>='0'&&a[i]<='9')||a[i]=='.')i++;//找到第一个不为数字的字符            i--;//回到最后一个数字字符上,因为for循环最后i++;            int k;            if(!flag||(a[j-1]=='-'&&(a[j-2]=='('||a[j-2]=='+'||a[j-2]=='-'||a[j-2]=='*'||a[j-2]=='/'))||(a[j-1]=='-'&&j-1==0)||(a[j-1]=='+'&&j-1==0)||(a[j-1]=='+'&&(a[j-2]=='('||a[j-2]=='+'||a[j-2]=='-'||a[j-2]=='*'||a[j-2]=='/')));//负数或者第一个数字,数字前不打空格,否则会和负号分开            else printf(" ");//这里是j千万别写成i,j记录的数字的开头            flag = 1;            for(k = j; k <= i; k++)printf("%c",a[k]);//输出        }        else{//如果是运算符            if(i==0&&(a[i]=='-'||a[i]=='+')){//开始的符号                if(a[i]=='-')printf("%c",a[i]);                continue;            }            if(i==1&&a[i-1]=='('&&(a[i]=='-'||a[i]=='+')){//如果第一个是括号然后又是正负,坑死了这里,打死没想到                if(a[i]=='-')printf("%c",a[i]);                continue;            }            if(top==-1){//如果栈为空,直接把运算符加进去                s[++top] = a[i];            }            else{//入队原则:如果当前符号比栈顶优先级大,入栈,否则pop输出栈顶,再继续比较,直到比栈顶优先级大再入栈                if(a[i]=='+'||a[i]=='-'){//如果是加减号                    if(a[i]=='-'&&a[i-1]=='('){//中间的负号                        printf(" -");                        continue;                    }                    if(a[i]=='+'&&a[i-1]=='('){//中加的加号                        printf(" ");//如果有正号,不输出!!坑死                        continue;                    }                    if((a[i]=='+'||a[i]=='-')&&(a[i-1]=='+'||a[i-1]=='-'||a[i-1]=='*'||a[i-1]=='/')){                        if(a[i]=='-')printf(" %c",a[i]);                        if(a[i]=='+')printf(" ");//正号不输出                        continue;                    }                    //if(s[top]=='*'||s[top]=='/'){//首先比较时第一个一定要比当前优先级大才开始出队。否则只能入队                        while((top!=-1)&&(s[top]=='+'||s[top]=='-'||s[top]=='/'||s[top]=='*')){//比较如果栈内元素优先级大于当前符号。先出栈,直到比它大                            printf(" %c",s[top--]);                        }                    //}                    s[++top] = a[i];//判断并出栈之后这个符号就可以入栈了                }                else if(a[i]=='*'||a[i]=='/'){//如果是乘除号                    while((top!=-1)&&(s[top]=='*'||s[top]=='/')){//因为乘除号是最高优先级,所以只有相等时需要出栈                        printf(" %c",s[top--]);                    }                    s[++top] = a[i];                }                else if(a[i]=='('){//左括号的时候比较特殊,直接入栈                    s[++top] = a[i];                }                else if(a[i]==')'){//右括号的时候直接出栈到左括号                    while((top!=-1)&&s[top]!='(')                        printf(" %c",s[top--]);                    top--;//把左括号pop掉                }            }        }    }    //结束后栈内剩下的符号一次出栈输出即可    while(top!=-1){        printf(" %c",s[top--]);    }    return 0;}


原创粉丝点击