专题——前、中、后缀表达式的计算

前言

不同表达式的计算

正文

首先还是需要知道一下关于中缀转前后缀的方法
具体参考转换方法

以 (5+2+1✖3)/5 为例
后缀:52+13*+5/
前缀:/++52*135

其中,中缀和后缀表达式的计算是重点,前缀和后缀计算类似,具体参见代码

代码

#include <stdio.h>
#include <string.h>
double cal_suffix(char *str);
double cal_preffix(char *str);
double Cal_fix( char str[]);
int main(){
	char str[]="52+13*+5/";
	char str2[]="/++52*135";
	char str3[]="(5+2+1*3)/5";
	printf("%.f\n",cal_suffix(str));
	printf("%.f\n",cal_preffix(str2));
	printf("%.f",Cal_fix(str3));
	
}
double cal(double a,double b,char c){ //计算两数
	switch(c){
		case '+':return a+b;
		case '-':return a-b;
		case '*':return a*b;
		case'/':return a/b;
	}
}
int operate(char c){ //判断是否为操作符
	switch(c){
		case '+':return 1;case '-':return 1;case '*':return 1;
		case'/':return 1;default :return 0;
	}
}

前缀计算

double cal_preffix(char *str){
	double a,b,result=0,stack[100];
	int i=0,top=-1;
	for(i=strlen(str)-1;i>=0;i--){//从右往左
		if(!operate(str[i])){  //如果是数字则进栈
			stack[++top]=str[i]-'0';
		}
		else{
			a=stack[top--]; //取出栈顶元素
			b=stack[top--]; //取出栈顶元素
			result=cal(a,b,str[i]); //二目运算
			stack[++top]=result; //计算结果入栈
		}
		
	}
	return result;
}

中缀计算

double Cal_fix( char str[]){
	double stack1[200];//存放数字栈
	char stack2[100];//存放字符栈
	int top1=-1,top2=-1,i=0;
	char a;
	double b,c;
	while(str[i]!='\0'){
		if(str[i]=='+'||str[i]=='-'){
			if(top2==-1){ //栈中没有运算符,则入栈
				stack2[++top2]=str[i];
			}
			else{
				while(stack2[top2]=='+'||stack2[top2]=='-'||stack2[top2]=='*'||stack2[top2]=='/'){ 
					a=stack2[top2--]; //栈2顶的运算符弹出
					c=stack1[top1--]; //取出一个数字
					b=stack1[top1--]; //取出一个数字
					stack1[++top1]=cal(b,c,a); //运算结果入栈
					printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
				}
				stack2[++top2]=str[i];  //运算结束,字符入栈2
			}
		}
		else if(str[i]=='*'||str[i]=='/'){
			if(top2==-1){
				stack2[++top2]=str[i];
			}
			else{
				while(stack2[top2]=='*'||stack2[top2]=='/'){
				    a=stack2[top2--];
					c=stack1[top1--];
					b=stack1[top1--];
					stack1[++top1]=cal(b,c,a);
					printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
				}
				stack2[++top2]=str[i]; 
			}
		}
		else if(str[i]=='('){  //如果是左括号直接入栈
			stack2[++top2]=str[i];
		}
		else if(str[i]==')'){ //如果是右括号,则计算第一个左括号内的所有操作符,最后将此左括号弹出
			while(stack2[top2]!='('){
		        a=stack2[top2--];
			    c=stack1[top1--];
				b=stack1[top1--];
				stack1[++top1]=cal(b,c,a);
				printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
			}
			stack2[top2--]; //弹出左括号
		}
		else  //不是操作符直接入栈1
			stack1[++top1]=str[i]-'0';
	    i++;
	}
	while(top2!=-1){ //遍历如果栈不为空。计算剩下操作符
        a=stack2[top2--];
		c=stack1[top1--];
		b=stack1[top1--];
		stack1[++top1]=cal(b,c,a);
		printf("%.f%c%.f=%.f\n",b,a,c,stack1[top1]);
	}
	return stack1[top1]; //返回结果
} 

后缀计算

double cal_suffix(char *str){
	double a,b,result=0,stack[100];
	int i=0,top=-1;
	while(str[i]!='\0'){//从左往右
		if(!operate(str[i])){
			stack[++top]=str[i]-'0';
		}
		else{
			b=stack[top--];
			a=stack[top--];
			result=cal(a,b,str[i]);
			stack[++top]=result;
		}
		i++;
	}
	return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值