C语言中缀转后缀

本文介绍了使用C语言编写的中缀表达式到后缀表达式的转换算法,虽然实现过程中需要处理多种情况,导致代码较为复杂,但最终运行成功并得到理想结果。

运行成功,结果完美
太多情况要考虑了(超级多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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值