中缀表达式转后缀表达式(逆波兰表达式)

#include<iostream>


int main(){
	int op_top=-1;
	int data_top=-1;
	double data[100]={0};
	char optr[100]={0};

	char nibolan[300];//逆波兰的字符串
	int NL=-1;//用于记录逆波兰的下标

	char a[]="3.0*(4.0+2.0)/2.0-5.0";//中缀表达式


	printf("%d\n",sizeof(a));

	int flag=1;//标记是不是负号
	for(int i=0;i<sizeof(a)-1;i++){// 遍历字符串转化为逆波兰
		switch(a[i]){
			case '(':
				printf("%c\n",a[i]);
				op_top++;
				optr[op_top]=a[i];
				flag=1;
				break;
			case ')':
				printf("%c\n",a[i]);
				if(op_top!=-1){
					while(optr[op_top]!='('){
						NL++;
						nibolan[NL]=optr[op_top];
						op_top--;
					}
				}
				op_top--;
				flag=0;
				break;
			case '+':
			case '-':
				printf("%c\n",a[i]);
				if(flag==1){
					if(a[i]=='-'){
						op_top++;
						optr[op_top]='@';
					}
					break;
				}
				while(op_top!=-1&&optr[op_top]!='('){
					NL++;
					nibolan[NL]=optr[op_top];
					op_top--;
				}
				op_top++;
				optr[op_top]=a[i];
				flag=0;
				break;
			case '*':
			case '/':
				printf("%c\n",a[i]);
				if(op_top!=-1){
					while(optr[op_top]=='*'||optr[op_top]=='/'){
						NL++;
						nibolan[NL]=optr[op_top];
						op_top--;
					}
				}
				op_top++;
				optr[op_top]=a[i];
				flag=0;
				break;
			default:
				printf("%c\n",a[i]);
				if(a[i]>='0'&&a[i]<='9'){
					NL++;
					nibolan[NL]=a[i];
					if(i<sizeof(a)-1){
						i++;
					}
					while(a[i]>='0'&&a[i]<='9'){
						NL++;
						nibolan[NL]=a[i];
						if(i<sizeof(a)-1){
							i++;
						}
					}
					if(a[i]=='.'){
						NL++;
						nibolan[NL]=a[i];
						if(i<sizeof(a)-1){
							i++;
						}
						while(a[i]>='0'&&a[i]<='9'){
							NL++;
							nibolan[NL]=a[i];
							if(i<sizeof(a)-1){
								i++;
							}
						}
					}
				}
				i--;
				NL++;
				nibolan[NL]='#';
				flag=0;
				break;
		}
	}
	while(op_top!=-1){
		NL++;
		nibolan[NL]=optr[op_top];
		op_top--;
	}
	for(i=0;i<=NL;i++){
		printf("%c",nibolan[i]);
	}
	printf("\n");
	printf("%d\n",NL);

	double d=0;
	double x=0.1;
	for(i=0;i<=NL;i++){
		switch(nibolan[i]){
			case '+':
				data[data_top-1]=data[data_top-1]+data[data_top];
				data_top--;
				break;
			case '-':
				data[data_top-1]=data[data_top-1]-data[data_top];
				data_top--;
				break;
			case '*':
				data[data_top-1]=data[data_top-1]*data[data_top];
				data_top--;
				break;
			case '/':
				if(data[data_top]==0){
					printf("表达式有错误,除数不能为零\n");
				}else{
					data[data_top-1]=data[data_top-1]/data[data_top];
					data_top--;
				}
				break;
			case '@':
				data[data_top]=-(data[data_top]);
				break;
			default:
				d=0;
				while(nibolan[i]>='0'&&nibolan[i]<='9'){
					d=d*10+(nibolan[i]-'0');
					i++;
				}
				x=0.1;
				if(nibolan[i]=='.'){
					i++;
					while(nibolan[i]>='0'&&nibolan[i]<='9'){
						d=d+x*(nibolan[i]-'0');
						x=x*x;
						i++;//这时候是‘#’,跳过
					}
				}
				data_top++;
				data[data_top]=d;
				break;
		}
	}


	double result=data[data_top];
	printf("表达式的结果是:%lf\n",result);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

至尊小毛毛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值