算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
目录
输入在一行中给出不含空格的中缀表达式,可包含+
、-
、*
、/
以及左右括号()
,表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
栈限制
8192 KB
#include <stdio.h>
#include <string.h>
//此代码由浙江大学(宁波分校)学生发布,仅供学习和参考。
int level(char n){//创建函数用于判断字符优先级,
if(n=='+'||n=='-')
return 1;
if(n=='*'||n=='/')
return 2;
if(n=='(')
return -1;
if(n==')')
return 4;
if(n=='=')
return -2;
return 0;
}
int main(){
char a[99],data[99];
data[0]='=';//将data栈里面data[0]字符优先级设为最低
int top=0,i,n,flag1,flag2,flag=0;//flag1用于标记小数点 ,flag2用于判断-1或+1,flag用于判断是否有运算数输出。
scanf("%s",a);
n=strlen(a);
for(i=0;i<n;i++){
if(i==0&&level(a[i])==1){//此处if喝else if用于判断正数或负数。
if(a[i]=='-'){//正数不做处理,负数要输出
if(a[i]=='-')
printf("%c",a[i]);
flag2=1;
}
continue;
}else if(i>0){//应对'('出现在开头
if(a[i-1]=='('&&level(a[i])==1){
if(a[i]=='-'){
if(a[i]=='-')
printf(" %c",a[i]);
flag2=1;
}
continue;
}
}
if(a[i]=='.'){//判断'.'出现
printf(".");
flag1=1;
continue;
}
if(level(a[i])==1||level(a[i])==2){//判断'+','-','*','/'运算符
while(level(a[i])<=level(data[top])){//若运算符栈里运算优先级更高或相等,则pop出来,直到出现栈里运算符更低或到栈底。
printf(" %c",data[top--]);
}
data[++top]=a[i];
}
else if(level(a[i])==-1){//判断'('
data[++top]=a[i];
}else if(level(a[i])==4){//判断')' ,并将
while(level(data[top])!=-1){
printf(" %c",data[top--]);
}
top--;
}
else{//此处是输出运算数
if(flag1==1){
printf("%c",a[i]);
flag1=0;
}
else if(flag2==1){
printf("%c",a[i]);
flag2=0;
}
else if(level(a[i-1])==0){//判断前一位是否为运算数,从而输出多位数字。
printf("%c",a[i]);
}
else if(flag==0){
printf("%c",a[i]);
}
else
printf(" %c",a[i]);
flag++;
}
}
for(i=top;i>=1;i--){//将栈剩余的pop出来。
printf(" %c",data[i]);
}
return 0;
}