二、递归之逆波兰表达式

自己写的

#include <iostream>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

string CalPolishNotation(vector<string> &vecstr)
{
	if(vecstr.size()>1)
	{
		for(int i=0;i<vecstr.size();i++)
		{
			if(((vecstr[i]=="+")||(vecstr[i]=="-")||(vecstr[i]=="*")||(vecstr[i]=="/")))
			{
				if(vecstr[i+1]!="+"&&vecstr[i+1]!="-"&&vecstr[i+1]!="*"&&vecstr[i+1]!="/")
				{
					if(vecstr[i+2]!="+"&&vecstr[i+2]!="-"&&vecstr[i+2]!="*"&&vecstr[i+2]!="/")
					{
						double dval=0,dval1=0,dval2=0;
						dval1=atof(vecstr[i+1].c_str());
						dval2=atof(vecstr[i+2].c_str());
						if(vecstr[i]=="+")
						{
							dval=dval1+dval2;
						}
						else if(vecstr[i]=="-")
						{
							dval=dval1-dval2;
						}
						else if(vecstr[i]=="*")
						{
							dval=dval1*dval2;
						}
						else if(vecstr[i]=="/")
						{
							dval=dval1/dval2;
						}
						stringstream ss;
						ss<<dval;
//						const std::string& new_val = std::to_string(dval);
						vecstr.insert(vecstr.begin()+i,ss.str());
						vecstr.erase(vecstr.begin()+i+1);
						vecstr.erase(vecstr.begin()+i+1);
						vecstr.erase(vecstr.begin()+i+1);
						break;
					}
				}
			}
		}
		CalPolishNotation(vecstr);
	}
	return vecstr[0];
}

int main()
{
	string strcin;
	vector<string> vecstr;
	while(cin>>strcin)
	{
		vecstr.push_back(strcin);
		if(cin.get()=='\n')
			break;
	}

	string strret=CalPolishNotation(vecstr);
	cout<<strret<<endl;

	return 0;
}

我觉得老师的代码真是牛,简洁明了:

#include <iostream>
using namespace std;

double exp()
{
	char s[20];
	cin>>s;
	switch(s[0])
	{
	case '+':
		return exp()+exp();
		break;
	case '-':
		return exp()-exp();
		break;
	case '*':
		return exp()*exp();
		break;
	case '/':
		return exp()/exp();
		break;
	default:
		return atof(s);
		break;
	}
}

int main()
{
	cout<<exp()<<endl;
	return 0;
}
发布了203 篇原创文章 · 获赞 18 · 访问量 74万+

猜你喜欢

转载自blog.csdn.net/nanfeiyannan/article/details/104929584