表达式计算(前后缀表达式转换及计算)

数据结构课程设计其中的一题,表达式计算,包含负数、小括号、大于9的数、单个数、前后缀表达式转换及计算。
不包括浮点数(不难实现,只是懒得改),中大括号(加点优先级判断不难,但检验输入是否合法有点难度),当输入不合法但可以算,如5*-3,而不是5*(-3)时(这点比较难)

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1e5+7;
string a,x,y;
int n;
stack<char>sz,st;
stack<int>p,q;
//优先级判断 
int pre(char t){
	if(t=='*'||t=='/')	return 3;
	if(t=='+'||t=='-')	return 2;
	if(t=='(')	return 4;
	if(t==')')	return 1;
}
int prt(char t){
	if(t=='*'||t=='/')	return 3;
	if(t=='+'||t=='-')	return 2;
	if(t=='(')	return 1;
	if(t==')')	return 4;
}
//判断是否为一个数 
bool cc(char t){
	if(t!='*'&&t!='/'&&t!='+'&&t!='-')	return t;
	return 0;
}
int main(){
	cout<<"Please enter an infix expression:"<<endl;
	cin>>a;	n=a.size();
	//中缀表达式转前缀表达式
	for(int i=n-1;i>=0;i--){
		if(isdigit(a[i])){
			int sum=a[i]-'0',k=1;
			while(isdigit(a[i-1])){
				sum+=(a[i-1]-'0')*pow(10,k);
				i--;	k++;
			}
			x.push_back(sum+'0');
		}
		else if(a[i]=='('){
			while(1){
				char temp=sz.top();
				sz.pop();
				if(temp==')')	break;
				x.push_back(temp);
			}
		}
		else if(a[i]==')')	sz.push(a[i]);
		else{
			if(!sz.empty()&&pre(a[i])<=pre(sz.top())){
				x.push_back(sz.top());
				sz.pop();
			}
			sz.push(a[i]);
		}
	}
	while(!sz.empty()){
		x.push_back(sz.top());
		sz.pop();
	}
	cout<<"The prefix expression is:"<<endl;
	for(int i=x.size()-1;i>=0;i--){
		if(cc(x[i]))	cout<<int(x[i]-'0')<<' ';
		else			cout<<x[i]<<' ';
	}
	putchar('\n');
	//中缀表达式转换为后缀表达式
	for(int i=0;i<n;i++){
		if(isdigit(a[i])){
			int sum=a[i]-'0';
			while(isdigit(a[i+1])){
				sum=sum*10+(a[i+1]-'0');
				i++;
			}
			y.push_back(sum+'0');
		}
		else if(a[i]=='(')	st.push(a[i]);
		else if(a[i]==')'){
			while(1){
				char temp=st.top();
				st.pop();
				if(temp=='(')	break;
				y.push_back(temp);
			}
		}
		else{
			if(!st.empty()&&prt(a[i])<=prt(st.top())){
				y.push_back(st.top());
				st.pop();
			}
			st.push(a[i]);
		}
	}
	while(!st.empty()){
		y.push_back(st.top());
		st.pop();
	}
	cout<<"The postfix expression is:"<<endl;
	for(int i=0;i<y.size();i++){
		if(cc(y[i]))	cout<<int(y[i]-'0')<<' ';
		else			cout<<y[i]<<' ';
	}
	putchar('\n');
	//前缀表达式计算
	for(int i=0;i<x.size();i++){
		if(cc(x[i]))	p.push(x[i]-'0');
		else{
			int a1=p.top();	p.pop();
			int a2=p.top();	p.pop();
			int sum=0;
			if(x[i]=='*')		sum=a1*a2;
			else if(x[i]=='/')	sum=a1/a2;
			else if(x[i]=='+')	sum=a1+a2;
			else if(x[i]=='-')	sum=a1-a2;
			p.push(sum);
		}
	}
	cout<<"The prefix expression evaluates to:"<<endl;
	cout<<p.top()<<endl;
	//后缀表达式计算
	for(int i=0;i<y.size();i++){
		if(cc(y[i]))	q.push(y[i]-'0');
		else{
			int a1=q.top();	q.pop();
			int a2=q.top();	q.pop();
			int sum=0;
			if(y[i]=='*')		sum=a1*a2;
			else if(y[i]=='/')	sum=a2/a1;
			else if(y[i]=='+')	sum=a1+a2;
			else if(y[i]=='-')	sum=a2-a1;
			q.push(sum);
		}
	}
	cout<<"The postfix expression evaluates to:"<<endl;
	cout<<q.top()<<endl;	
}
/*
2*3/(2-1)+3*(4-1)

9+(3-1*2)*3+10/2
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值