【问题描述】
输入一个中缀表达式,表达式中有+、-、*、/四种运算以及(、),表达式中的其他符号为大写的字母。实现一个算法,得到相应的后缀表达式。
【输入形式】
一个式子的中缀表达式,以#结束
【输出形式】
相应的后缀表达式
【样例输入】
A*(B-C)/D+E#
【样例输出】
ABC-*D/E+
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
char stack[100];
int i=0,top=0,base=0;
char a;int l;
char sin[100];
scanf("%s",sin);
l=strlen(sin)-1;
int pre(char c){//给加减乘除赋予优先级分数
if(c=='*'||c=='/'){
return 3;
}
if(c=='+'||c=='-'){
return 2;
}
if(c=='('){
return 1;
}
}
void push(int x){//入栈操作
stack[top++]=x;
}
char pop(){//出栈操作
char x = stack[--top];
return x;
}
char e;
while(i<l){
if(sin[i]>='A'&&sin[i]<='Z'){//如果为操作数,直接输出
printf("%c",sin[i]);
}else if(sin[i]=='('){//左括号压入堆栈
push(sin[i]);
}else if(sin[i]==')'){//遇到右括号,运算符号出栈
e=pop();
while(e!='('){//直到遇到左括号,停止出栈
printf("%c",e);
e=pop();
}
}else{//如果为运算符,对比优先级,出栈,入栈
while(base<top&&pre(stack[top-1])>=pre(sin[i])){
printf("%c",pop());
}
push(sin[i]);
}
i++;
}
while(base<top){
printf("%c",pop());
}
return 0;
}