其他分享
首页 > 其他分享> > 栈的应用:中缀表达式计算(c语言)

栈的应用:中缀表达式计算(c语言)

作者:互联网

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define Min 1e-8
#define maxSize 10 
int priority(char p){
	 if(p=='+'||p=='-'){
		return 0;
	}else{
		return 1;
	}
} 
//子表达的计算 
int calSub(float opand1,char op,float opand2,float &result){
	//根据操作符进行计算 
	if(op == '*') result=opand1*opand2;
	if(op == '+') result=opand1+opand2;
	if(op == '-') result=opand1-opand2;
	if(op == '/'){//若是除则需要判断除数为零的情况 
		if(fabs(opand2)<Min){// 浮点数没有准确的表达,只能用绝对值来表示差不多的范围 
			return 0;
		}
		else{
			result =opand1/opand2;
		}
	} 
	return 1;
}
int calStackTopTwo(float s1[],int &top1,char s2[],int &top2){
	float a=s1[top1--];//弹出栈顶元素后指针下移 
	float b=s1[top1--];
	float result; 
	char op=s2[top2--];
	int flag=calSub(b,op,a,result);//进行子表达式的计算 
	if(flag==0){
		printf("被除数为零"); 
		return 0;
	}
	s1[++top1]=result;//计算结果存入栈顶 
	return 1;
	
} 
//计算表达式的函数 
float getResult(char exp[]){
	int i=0;//用于指向字符串(中缀表达式)的指针 
	//声明两个栈,一个float型,一个char型 
	//表达式中操作数存在一个栈内,运算符存入一个栈内
	//top1,top2用于指向两个栈的栈顶 
	float s1[maxSize];int top1=-1; 
	char s2[maxSize];int top2=-1;
	
	while(exp[i]!='\0'){//字符串结尾以'\0' 
		if(exp[i]>='0'&&exp[i]<='9'){//判断是否是数字,但此处只能判断0-9之间的一位数字 
			 s1[++top1]=exp[i]-'0';//字符串转换为数字 
			 ++i;//下一个字符 
		} 
		else if(exp[i]=='(') {//如果是左括号的话直接进栈 
			s2[++top2]='(';
			i++;
		}else if(exp[i]=='*'|| //如果是运算符则进行以下判断 
				 exp[i]=='/'||
				 exp[i]=='+'||
				 exp[i]=='-'){
				 	//如果栈顶为左括号或者栈空,或者当前符号优先级大于栈顶符号优先级则入栈 
				 	if(s2[top2]=='('||top2==-1||priority(exp[i])>priority(s2[top2])){
				 		s2[++top2]=exp[i];
				 		i++;
					 }else{
					 	int flag=calStackTopTwo(s1,top1,s2,top2);//当前运算符小于栈顶元素优先级则弹出数据栈的两个 
						if(flag==0){
							return 0;
						}
					 }                                  //操作数,进行运算后存入栈顶,完毕后i的值不发生 
				 }                                      //变化 
		 else if(exp[i]==')'){//如果碰到右括号,则弹出栈内直至左括号的所有运算符 
		 	while(s2[top2]!='('){//弹出一个运算符都需要进行计算 
		 		int flag=calStackTopTwo(s1,top1,s2,top2);
		 		if(flag==0){
							return 0;
						}
		 		
			 }
			 --top2;//更新栈顶指针 
			 i++;
		 	
		 }
	
	}
	//当表达式进栈完毕后 
	//只要符号栈内还有元素就继续进行运算 
	while(top2!=-1){
		 	int flag=calStackTopTwo(s1,top1,s2,top2);
		 	if(flag==0){
		 		return 0;
			 } 
		 }
	return s1[top1];
}
int main(){
	char s[10];
	scanf("%s",s);//录入字符串 
	printf("%f",getResult(s));
}

代码运行截图:

笑看风声 发布了73 篇原创文章 · 获赞 31 · 访问量 1万+ 私信 关注

标签:return,中缀,int,s2,top2,flag,opand2,表达式,语言
来源: https://blog.csdn.net/weixin_37716512/article/details/104093043