后缀表达式转化及求值

#include<stdio.h>
#include<stack>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
#define MAXN 111
map<char,int>yxj;//优先级
char shi[MAXN];
char houzui[MAXN];
int count1=0,count2=0,len;
void init(){
yxj['+']=1;
yxj['-']=1;
yxj['*']=2;
yxj['/']=2;
}

void hz(){
stack<char> sta;
	sta.push('#');
	count1=0,count2=0;
	while(!sta.empty()){
		if(shi[count1]>='0'&&shi[count1]<='9'){//判断是数字,则进后缀数组
				houzui[count2++]=shi[count1];	
		}
		else{//判断为是运算符或括号
			if(shi[count1]=='('){//左括号进栈
			sta.push(shi[count1]);
			}
			else if(shi[count1]==')'){//右括号则输出栈内运算符,直到碰到左括号
			while(sta.top()!='('){
			houzui[count2++]=sta.top();
			sta.pop();
			}
			sta.pop();
			}
			else{//判断为运算符
			
			if(sta.top()=='#'){//如果是第一个运算符则直接进栈
			sta.push(shi[count1]);
			}
			else{
				if(yxj[shi[count1]]>yxj[sta.top()]){//当前运算符优先级大于栈顶运算符优先级,直接进栈
					sta.push(shi[count1]);
				}
				else{
					char temp=shi[count1];
				while(yxj[temp]<=yxj[sta.top()]){//输出不大于当前运算符优先级的栈里的运算符
				houzui[count2++]=sta.top();
				sta.pop();
				if(sta.top()=='#')
				break;
				}
					sta.push(temp);//当前运算符进栈
				}
			}//不为# 
			}
		}
		count1++;//计数器向后移
			if(count1==len){//扫描完表达式长度,则输出完栈里所有运算符
				while(!sta.empty()){
				houzui[count2++]=sta.top();
				sta.pop();
				}
			}
		}//stack	
		for(int i=0;i<count2-1;++i)
		printf("%c",houzui[i]);
		printf("\n");
}

int qz(){
	stack<int> sta;//此求值只针对个位整数,若表达式出现除法,出现小数,可以栈可以设为double, 
	//若多位可以在输入内设个num数组然后num[count3]=num[count3]*10+shi[count1],重新组建个结
	//构体struct{ char number[111];}存放数字和运算符
	for(int i=0;i<count2-1;++i){
	if(!(houzui[i]>='0'&&houzui[i]<='9')){ //若为运算符,则退出栈内2个数字进行相关运算
		int sec=sta.top();
		sta.pop();
		int fir=sta.top();
		sta.pop();
		int result;
		if(houzui[i]=='+')
		result=fir+sec;
		else if(houzui[i]=='-')
			result=fir-sec;
		else if(houzui[i]=='*')
			result=fir*sec;
		else if(houzui[i]=='/')
			result=fir/sec;
		sta.push(result);	//将结果压栈
	}
	else//为数字,则进栈
	sta.push(houzui[i]-'0');	
	}
return sta.top();
}
int main(){
init();
while(scanf("%s",shi)!=EOF){
	count1=0,count2=0;
	len=strlen(shi);
	hz();
	
	printf("值为%d\n",qz());
	}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值