LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)
来源:互联网 发布:营养师网络兼职招聘 编辑:程序博客网 时间:2024/06/05 13:26
题目:
Evaluate the value of an arithmetic expression in Reverse Polish Notation..
求逆波兰算术表达式的值。
Valid operators are +
, -
, *
, /
. Each operand may be an integer or another expression.
有效的操作符只有 +
, -
, *
, / 。
每个操作数是一个整数或者表达式。
Some examples:
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6关于逆波兰表示法:
逆波兰记法中,操作符置于操作数的后面。例如表达“三加四”时,写作“3 4 +”,而不是“3 + 4”。如果有多个操作符,操作符置于第二个操作数的后面,所以常规中缀记法的“3 - 4 + 5”在逆波兰记法中写作“3 4 - 5 +”:先3减去4,再加上5。使用逆波兰记法的一个好处是不需要使用括号。例如中缀记法中“3 - 4 * 5”与“(3 - 4)*5”不相同,但后缀记法中前者写做“3 4 5 * -”,无歧义地表示“3 (4 5 *) −”;后者写做“3 4 - 5 *”。
思路:
先将操作数入栈;遇到操作符时,出栈两个操作数,求值,再将结果入栈;当一遍后,栈顶就是表达式的值。
这里有一个问题是,所给的操作数和操作符是以字符串string形式给出,计算时需要将字符串转化成int型数,可以使用stoi()函数,也可以自己定义函数转化。
代码1:
class Solution {public: int evalRPN(vector<string> &tokens) { stack<int> stk; if(tokens.empty()) return 0; for(int i = 0 ; i < tokens.size() ; i++) { int value = 0x7fffffff; char a = '\0'; value = string_to_int(tokens[i],a);//调用stoi函数把string转化为操作数或者操作符 //当为操作数时,入栈 if(value != 0x7fffffff && a == '\0') stk.push(value); else //当s为操作符时,先出栈计算,然后再把结果入栈 if(value == 0x7fffffff && a != '\0') { int pre_2,pre_1;//pre_1为前一个操作数,pre_2为后一个操作数 int new_value = 0;//计算后的新值 if(!stk.empty()) { pre_2 = stk.top(); stk.pop(); } if(!stk.empty()) { pre_1 = stk.top(); stk.pop(); } switch(a) { case '+': new_value = pre_1 + pre_2; break; case '-': new_value = pre_1 - pre_2; break; case '*': new_value = pre_1 * pre_2; break; case '/': new_value = pre_1 / pre_2; break; } stk.push(new_value);//新值入栈 } } return stk.top();//返回栈顶,即为结果 } //stoi函数,a是操作符,a如果为空,说明当前字符串s是操作数,如果不为空说明s是操作符 int string_to_int(string s , char & a) { int value = 0x7fffffff; int len = s.size(); if(len < 1) return value; //s只有一个字符时,判断是否是操作符 if(len == 1) { char tmp = s[0]; if(tmp == '+' || tmp == '-' || tmp == '*' || tmp == '/') { a = s[0]; return value; } } //s为操作数时,把它转化为int型,注意操作数为负数时的情况 value = 0; a = '\0';//把a置为空 //为负数时的情况 if(s[0] == '-') { for(int i = 1 ; i < len ; i++) { value = value *10 + (s[i] - '0' ); } value = value * (-1); } else for(int i = 0 ; i < len ; i++) { value = value *10 + (s[i] - '0' ); } return value; }};
代码2:
class Solution {public: int evalRPN(vector<string> &tokens) { stack<int> stk; if(tokens.empty()) return 0; for(int i = 0 ; i < tokens.size() ; i++) { string cur = tokens[i]; //如果不是操作符,则把它转换成int型,然后入栈 if(!is_operator(cur)) stk.push(stoi(cur)); else { int pre_2 = stk.top(); stk.pop(); int pre_1 = stk.top(); stk.pop(); if(cur == "+") stk.push(pre_1 + pre_2); else if(cur == "-") stk.push(pre_1 - pre_2); else if(cur == "*") stk.push(pre_1 * pre_2); else stk.push(pre_1 / pre_2); } } return stk.top(); } //判断s是否是操作符 bool is_operator(string s) { string str("+-*/"); //string::npos表示在str中没有查找到s[0]时的返回值,find的中的0表示从头开始查找 if(s.size() == 1) return str.find(s[0],0) != string::npos ? true : false ; return false; }};
0 0
- LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)
- LeetCode:150. Evaluate Reverse Polish Notation(逆波兰表达式)
- leetcode Evaluate Reverse Polish Notation(计算逆波兰表达式)
- [Leetcode] Evaluate Reverse Polish Notation 逆波兰表达式
- LeetCode Reverse Polish Notation求逆波兰表达式值
- Evaluate Reverse Polish Notation 逆波兰表达式
- Java实现逆波兰表达式(Evaluate Reverse Polish Notation)
- LeetCode | Evaluate Reverse Polish Notation(逆波兰式求值)
- leetcode 150. Evaluate Reverse Polish Notation 逆波兰表达式的计算
- 【LeetCode】Evaluate Reverse Polish Notation(逆波兰表达式求值) -(Linkedin) Medium ++
- 【LeetCode刷题Java版】Evaluate Reverse Polish Notation(计算逆波兰表达式)
- Leetcode 150 Evaluate Reverse Polish Notation (求值逆波兰表达式)
- java常用算法之逆波兰表达式(Evaluate Reverse Polish Notation)
- leetcode笔记:Evaluate Reverse Polish Notation(逆波兰式的计算)
- Evaluate Reverse Polish Notation 求RPN的值@LeetCode
- Java Evaluate Reverse Polish Notation(逆波兰表达式)
- leetcode_2 Evaluate Reverse Polish Notation 逆波兰表达式
- 【LintCode】Evaluate Reverse Polish Notation 逆波兰表达式求值
- 实时数据分布式服务器的策略
- activiti源码解读之心得整编
- Understanding Weak References(我见过的对Java引用解释最好的文章)
- EntityFramework学习笔记-VS2010安装EF
- OpenGLShader 编程系列 - 查询shader中的Uniforms
- LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)
- Linux中2>&1使用
- R的slidify 第一个ppt
- 关于C语言的一些容易搞混的问题
- UIView 基础动画
- C单链表的操作(创建、插入、删除)
- Android: 设置模拟按键快捷方式
- Oracle 12c 配置和修改 CDB 和 PDB 参数
- Android 5.0材料设计 RecyclerView的使用