算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式:
输入在一行中给出不含空格的中缀表达式,可包含+、-、*、\以及左右括号(),表达式不超过20个字符。
输出格式:
在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。
输入样例:
2+3*(7-4)+8/4
输出样例:
2 3 7 4 - * + 8 4 / +
#include<stdio.h>
#define N 10000
int level(char a,char b);
void infix_to_suffix(char *infix,char *suffix);
int main()
{
char infix[N], suffix[N];
scanf("%s",infix);
infix_to_suffix(infix,suffix);
printf("%s",suffix);
return 0;
}
int level(char a,char b)
{
if(b=='('){
return 1;
}else if((b=='*' || b=='/')&&(a=='+'||a=='-'||a=='(')) {
return 1;
}else if((b=='+' || b=='-')&&(a=='(')){
return 1;
}else{
return 0;
}
}
void infix_to_suffix(char *infix,char *suffix)
{
char stack[N];
int top=-1;
int i,j=0;
for(i=0;infix[i]!='\0';i++) {
if((infix[i]=='-'||infix[i]=='+')&&i==0){
suffix[j++]=infix[i];
}else if(infix[i]=='.'){
suffix[j++]=infix[i];
}else if(infix[i]>='0' && infix[i]<='9') {
suffix[j++] = infix[i];
}else {
if((infix[i]=='+')&&infix[i-1]=='('){
continue;
}
if(i!=0 && (infix[i-1]>='0'&&infix[i-1]<='9')) {
suffix[j++] = ' ';
}
if(infix[i]==')') {
while(stack[top]!='(') {
suffix[j++] = stack[top--];
suffix[j++] = ' ';
}
top-=1;
}else if(top==-1|| level(stack[top],infix[i])) {
stack[++top] = infix[i];
}else {
while(!level(stack[top],infix[i])) {
suffix[j++] = stack[top--];
suffix[j++] = ' ';
if(top==-1){
break;
}
}
stack[++top] = infix[i];
}
}
}
if(top!=-1 && suffix[j-1]!=' ') {
suffix[j++] = ' ';
}
while(top>0) {
suffix[j++] = stack[top--];
suffix[j++] = ' ';
}
suffix[j++] = stack[top];
suffix[j] = '\0';
}