运行成功,结果完美
太多情况要考虑了(超级多if),实际上写起来很繁琐。
#include <stdio.h>
#include <stdlib.h>
//数据总栈
typedef struct Gen{
char elem[200];
int top;
}gen;
// 符号总栈
typedef struct Sym{
char elem[200];
int top;
} sym;
//初始化
int init(gen *g,sym *s){
g->top=-1;
s->top=-1;
return 1;
}
//规定优先级
int replace(char a){
switch(a){
case '+':return 1;
case '-':return 1;
case '*':return 2;
case '/':return 2;
case '(':return 0;
}
return 100;
}
//比较优先级
int compare(char a,char b){
if(replace(a)<replace(b)){
return 1;
}
else{
return 0;
}
}
//开始转换
void change(char before[],gen *g,sym *s){
for(int i=0;before[i]!='\0';i++){
//char t=before[i];
//分第一种情况,分为数字和符号
if(before[i]>'A'&&before[i]<'Z'||before[i]<'z'&&before[i]>'a'){
g->elem[++g->top]=before[i];
}
else{
//第二种情况,符号栈里没有元素
if(s->top==-1){
s->elem[++s->top]=before[i];
continue;
}
//第三种情况,左括号,无脑入符号栈
if(before[i]=='('){
s->elem[++s->top]=before[i];
continue;
}
//第四种情况,右括号,无脑全部弹出(有选择的)
if(before[i]==')'){
while(s->elem[s->top]!='('){
g->elem[++g->top]=s->elem[s->top];
s->top--;
};
//因为最后还有一个左括号没弹出来
s->top--;
continue;
}
//第五种情况,两个普通符号相遇,这里很难
//如果插入符号优先级高
if(compare(s->elem[s->top],before[i])){
s->elem[++s->top]=before[i];
}
//如果插入符号优先级低
else{
g->elem[++g->top]=s->elem[s->top];
s->elem[s->top]=before[i];
//继续比较,所以真的很难
while(!compare(s->elem[s->top-1],s->elem[s->top])&&s->top>0){
g->elem[++g->top]=s->elem[s->top];
s->elem[s->top-1]=s->elem[s->top];
s->top--;
}
}
}
}
//当for结束,所有元素都进行比较后,如果符号栈里面还有符号,全部弹出
while(s->top!=-1){
g->elem[++g->top]=s->elem[s->top];
s->top--;
}
}
//遍历
void tra(gen *g){
for(int i=0;i<g->top+1;i++){
printf("%c",g->elem[i]);
}
printf("\n");
}
int main(){
sym s;
gen g;
char before[100];
scanf("%s",&before);
init(&g,&s);
change(before,&g,&s);
tra(&g);
return 0;
}
本文介绍了使用C语言编写的中缀表达式到后缀表达式的转换算法,虽然实现过程中需要处理多种情况,导致代码较为复杂,但最终运行成功并得到理想结果。
1265

被折叠的 条评论
为什么被折叠?



