[LeetCode] 逆波兰表达式求值
2013-11-28 17:00
375 查看
逆波兰表达式求值(Reverse Polish Notation,RPN)
来自维基:
逆波兰表示法(Reverse Polish notation,RPN,或逆波兰记法),是一种是由波兰数学家扬·武卡谢维奇1920年引入的数学表达式方式,在逆波兰记法中,所有操作符置于操作数的后面,因此也被称为后缀表示法。逆波兰记法不需要括号来标识操作符的优先级。
逆波兰结构由弗里德里希·鲍尔(Friedrich L. Bauer)和艾兹格·迪科斯彻在1960年代早期提议用于表达式求值,以利用堆栈结构和减少计算机内存访问。逆波兰记法和相应的算法由澳大利亚哲学家、计算机学家查尔斯·汉布林(Charles Hamblin)在1960年代中期扩充。
用栈实现逆波兰表达式很简单,将序列入栈,如果栈顶是运算符就出栈算出结果,然后再将结果入栈,循环这个过程。
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"); }
相关文章推荐
- LeetCode-150. Evaluate Reverse Polish Notation (JAVA)逆波兰表达式求值
- 【LeetCode】Evaluate Reverse Polish Notation(逆波兰表达式求值) -(Linkedin) Medium ++
- Leetcode 150 Evaluate Reverse Polish Notation (求值逆波兰表达式)
- LeetCode:波兰表达式求值(栈)
- 逆波兰表达式求值
- NYOJ-35-表达式求值(中缀式转后缀式 逆波兰表达式)
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
- 逆波兰表达式求值
- 2014.6.2~3逆波兰表达式求值(栈和队列)
- 从中序表达式到逆序表达式(逆波兰式)(四则运算表达式求值)
- 每天一道LeetCode-----对表达式添加括号并求值,返回所有可能的计算结果
- NYOJ35-表达式求值(逆波兰式)java
- 逆波兰表达式求值
- 算法:逆波兰表达式求值
- 中缀表达式转换成后缀表达式以及逆波兰表示法求值
- [LeetCode] 150. Evaluate Reverse Polish Notation 计算逆波兰表达式
- leetcode Evaluate Reverse Polish Notation(计算逆波兰表达式)
- NYOJ 35 表达式求值(逆波兰式求值)
- 逆波兰表达式的转化与求值(python实现)
- [LeetCode] Evaluate Reverse Polish Notation 计算逆波兰表达式