您的位置:首页 > 其它

[LeetCode] 逆波兰表达式求值

2013-11-28 17:00 375 查看
逆波兰表达式求值(Reverse Polish Notation,RPN)

来自维基:
逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。

逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问。逆波兰记法和相应的算法由澳大利亚哲学家、计算机学家查尔斯·汉布林(Charles Hamblin)在1960年代中期扩充。


例子


中缀表达式“5 + ((1 + 2) * 4) − 3”写作“ 5 1 2 + 4 * + 3 −”。

用栈实现逆波兰表达式很简单,将序列入栈,如果栈顶是运算符就出栈算出结果,然后再将结果入栈,循环这个过程。

RPN的四则运算实现如下:(代码很长很渣)

#include <iostream>
#include <stack>
#include <vector>
#include <string>
#include <stdlib.h>
#include <sstream>
using namespace std;

int evalRPN(vector<string> &tokens) {
stack<string> _stack;
stringstream result_s_str;
string result_str;
int result = 0, after = 0, before = 0;
int final_result = 0;

for(vector<string>::iterator iter = tokens.begin();iter != tokens.end();++iter){
_stack.push((*iter).c_str());
if(string("+") == _stack.top()||string("-") == _stack.top()||string("*") == _stack.top()||string("/") == _stack.top()){
switch(*_stack.top().c_str()){
case '+':
_stack.pop();
after = atoi(_stack.top().c_str());
_stack.pop();
before = atoi(_stack.top().c_str());
_stack.pop();
result = before + after;
result_s_str<<result;
result_s_str>>result_str;
result_s_str.str("");
result_s_str.clear();
_stack.push(result_str);
break;
case '-':
_stack.pop();
after = atoi(_stack.top().c_str());
_stack.pop();
before = atoi(_stack.top().c_str());
_stack.pop();
result = before - after;
result_s_str<<result;
result_s_str>>result_str;
result_s_str.str("");
result_s_str.clear();
_stack.push(result_str);
break;
case '*':
_stack.pop();
after = atoi(_stack.top().c_str());
_stack.pop();
before = atoi(_stack.top().c_str());
_stack.pop();
result = before * after;
result_s_str<<result;
result_s_str>>result_str;
result_s_str.str("");
result_s_str.clear();
_stack.push(result_str);
break;
case '/':
_stack.pop();
after = atoi(_stack.top().c_str());
_stack.pop();
before = atoi(_stack.top().c_str());
_stack.pop();
result = before / after;
result_s_str<<result;
result_s_str>>result_str;
result_s_str.str("");
result_s_str.clear();
_stack.push(result_str);
break;

default:break;
}

}
}
final_result = atoi(_stack.top().c_str());
return final_result;
}

int main(){
vector<string> a;
a.push_back("4");
a.push_back("13");
a.push_back("5");
a.push_back("/");
a.push_back("+");

cout<<evalRPN(a)<<endl;

system("pause");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: