[LeetCode] 逆波兰表达式求值

来源:互联网 发布:网络音乐游戏排行榜 编辑:程序博客网 时间:2024/05/10 10:48

逆波兰表达式求值(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");}


原创粉丝点击