问题提出:
计算用逆波兰表达式表示的算式的值,有效运算符为+,-,*,/,被操作的对象是整数或由整数和有效运算符组合而成的表达式。
示例:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
1.普通方法
解决这个问题并不难。一旦我们很好的理解了题意,很快意识到可以通过栈来求解该问题的。通过按序遍历将数组中的元素入栈,方法是遇到整数就将其入栈,遇到操作符就将栈里面的两个整数取出来用该操作符进行运算,最后将运算结果入栈,直至数组中的元素遍历完毕,即可算得整个表达式的值。其过程如图所示:
以下是c++程序代码(原文是java的)
// nibolan.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <string>
#include <vector>
#include <stack>
#include <sstream>
#include <iostream>
using namespace std;
class CRPN
{
public:
CRPN(vector<string>& vectStrRPN)
{
for (vector<string>::iterator iter=vectStrRPN.begin();iter!=vectStrRPN.end();iter++)
{
m_vectStrRPN.push_back(*iter);
}
}
int EvalueRPN();
bool IsOperater(string& strElement);
int Caculate(int nOperandA,int nOperandB,string& strOperator);
private:
vector<string> m_vectStrRPN;
};
bool CRPN::IsOperater(string& strElement)
{
string strOperators[4] = {"+","-","*","/"};
for (int i = 0;i<4;i++)
{
if (strOperators[i] == strElement)
{
return true;
}
}
return false;
}
int CRPN::Caculate(int nOperandA,int nOperandB,string& strOperator)
{
int nResult=0;
const char* pChar=strOperator.c_str();
char cOperater=pChar[0];
switch(cOperater)
{
case '+':nResult = nOperandA + nOperandB;break;
case '-':nResult = nOperandA - nOperandB;break;
case '*':nResult = nOperandA * nOperandB;break;
case '/':nResult = nOperandA / nOperandB;break;
}
return nResult;
}
int CRPN::EvalueRPN()
{
stack<string> tempStack;
for (vector<string>::iterator iter=m_vectStrRPN.begin();iter!=m_vectStrRPN.end();iter++)
{
if (!IsOperater(*iter))
{
tempStack.push(*iter);
}
else
{
int nOperandA = atoi(tempStack.top().c_str());
tempStack.pop();
int nOperandB = atoi(tempStack.top().c_str());
tempStack.pop();
int ntempResult = Caculate(nOperandA,nOperandB,*iter);
string strResult;
stringstream out;
out<<ntempResult;
strResult = out.str();
/*char cBuff[10] ={0};
itoa(nte*/
tempStack.push(strResult);
}
}
return atoi(tempStack.top().c_str());
}
int _tmain(int argc, _TCHAR* argv[])
{
vector<string> vectSampleRPN;
//{ "2", "1", "+", "3", "*" };
vectSampleRPN.push_back("2");
vectSampleRPN.push_back("1");
vectSampleRPN.push_back("+");
vectSampleRPN.push_back("3");
vectSampleRPN.push_back("*");
CRPN testRPN(vectSampleRPN);
int nResult = testRPN.EvalueRPN();
cout<<nResult;
return 0;
}