站外题求助
  • 板块学术版
  • 楼主TimelessWelkin
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/17 13:05
  • 上次更新2024/7/17 14:33:39
查看原帖
站外题求助
727185
TimelessWelkin楼主2024/7/17 13:05

rt,

逆波兰表达式是一种把运算符前置的算式表达式,普通的表达式2+3的逆波兰表达式位+2 3。逆波兰表达式的优点是不必用括号来改变运算次序,例如(2+3)∗4表示为∗+2 3 4,本题求解逆波兰表达式的值,其中运算符包括+ - * /四个

输入格式 输入一行,其中运算符和运算数之间用空格隔开

输出格式 输出为一行表达式的值

逆波兰表达式的定义:

1.一个数就是一个逆波兰表达式,这个数就是逆波兰表达式本身 //相当于一个终止条件

2.“运算符 逆波兰表达式 逆波兰表达式” 是逆波兰表达式,值为两个逆波兰表达式运算出的结果

代码:

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
string s;
double nbl(){
	while(cnt<s.size() && s[cnt]==' ' )cnt++;
	if(s[cnt]=='+' || s[cnt]=='-' || s[cnt]=='*' || s[cnt]=='/'){
		cnt++;
		if(s[cnt-1]=='+')return nbl()+nbl();
		if(s[cnt-1]=='-')return nbl()-nbl();
		if(s[cnt-1]=='/')return nbl()/nbl();
		if(s[cnt-1]=='*')return nbl()*nbl();
	}
	else if(s[cnt]<='9' && s[cnt]>='0'){
		int i=cnt;
		for(;i<s.size() && (s[i]=='.' || isdigit(s[i]));i++);
		string SS=s.substr(cnt,i-cnt+1);
		cnt=i;
		char S[100]={};
		for(int i=0;i<SS.size();i++)S[i]=SS[i];
		double a=atof(S);
		return a;
	}
}
int main(){
	getline(cin,s);
	printf("%.6lf",nbl());
}

80分

附:样例:

输入:

* + 11.0 12.0 + 24.0 35.0

输出

1357.000000
2024/7/17 13:05
加载中...