二、遞歸之逆波蘭表達式

自己寫的

#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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章