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

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;
}


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值