基于栈的中缀算术表达式求值

基于栈的中缀算术表达式求值

描述

输入一个中缀算术表达式,求解表达式的值。运算符包括+、-、*、/、(、)、=,参加运算的数为double类型且为正数。(要求:直接针对中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可。)

输入

多组数据,每组数据一行,对应一个算术表达式,每个表达式均以“=”结尾。当表达式只有一个“=”时,输入结束。参加运算的数为double类型。

输出

对于每组数据输出一行,为表达式的运算结果。输出保留两位小数。

输入样例

2+2=
20*(4.5-3)=
=

输出样例

4.00
30.00

代码

#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<stack>
using namespace std;
char Precede(char a,char b){
	if(a=='('&&b==')' ||a=='='&&b=='=')
		return '=';
	else if(a=='('||a=='='||b=='('||((a=='+'||a=='-')&&(b=='*'||b=='/')))
		return '<';
	else
		return '>';
}
double Fun(double a,double b,char c){
	if(c=='+')
		return b+a;
	else if(c=='-')
		return b-a;
	else if(c=='*')
		return b*a;
	else if(c=='/')
		return b/a;
}
int main(){
	stack<double> NumStack;
	stack<char> CharStack;
	char s[100];
	while(1){
		cin>>s;
		if(s[0]=='=')
			break;
		CharStack.push('=');
		int flag = 0;//是否开始读入数字
		int e=0;//记录小数点之后的位数*10
		int x=0;//记录不算入小数点情况下的数字
		double y=0;//计算出算上小数点后的数字
		double a,b;//从栈弹出的两个数字
		double c;//由a,b计算得到
		char oper;//弹出的运算符
		for(int i=0;s[i]!='\0';i++){
			if(s[i]>='0' && s[i]<='9'){
				flag = 1;
				x = x*10+s[i]-'0';
				if(e){
					e*=10;
				}
			}
			else if(s[i]=='.'){
				e = 1;
			}
			else{
				if(flag){ //读入字符,先将之前的数字压入栈
					if(e)
						y = x*1.0/e;
					else
						y = x*1.0;
					NumStack.push(y);
					x = 0;
					flag = 0;
					e = 0;
				}
				while(1){
					if(Precede(CharStack.top(),s[i])=='<'){
						CharStack.push(s[i]);
						break;
					}
					else if(Precede(CharStack.top(),s[i])=='>'){
						a = NumStack.top();
						NumStack.pop();
						b = NumStack.top();
						NumStack.pop();
						oper = CharStack.top();
						CharStack.pop();
						c = Fun(a,b,oper);
						NumStack.push(c);
					}
					else{
						CharStack.pop();
						break;
					}
				}
			
			}
		}
		cout<<fixed<<setprecision(2);
		cout<<NumStack.top()<<endl;
	}
	//system("pause");
	return 0;
}

参考

https://www.wenji.site/2018/11/04/11-4/

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值