LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)
2014-12-08 10:53
441 查看
题目:
Evaluate the value of an arithmetic expression inReverse 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;
}
};
相关文章推荐
- 【LeetCode】Evaluate Reverse Polish Notation(逆波兰表达式求值) -(Linkedin) Medium ++
- EvaluateReversePolishNotation 逆波兰表达式
- Leetcode刷题记——150. Evaluate Reverse Polish Notation(计算逆波兰表达式)
- Leetcode 150 Evaluate Reverse Polish Notation (求值逆波兰表达式)
- lintcode 中等题:Evaluate Reverse Polish notation逆波兰表达式求值
- [Leetcode] Evaluate Reverse Polish Notation 逆波兰表达式
- LeetCode-150. Evaluate Reverse Polish Notation (JAVA)逆波兰表达式求值
- leetcode_2 Evaluate Reverse Polish Notation 逆波兰表达式
- java常用算法之逆波兰表达式(Evaluate Reverse Polish Notation)
- Java实现逆波兰表达式(Evaluate Reverse Polish Notation)
- 150. Evaluate Reverse Polish Notation(逆波兰表达式)
- LeetCode Reverse Polish Notation求逆波兰表达式值
- 【LintCode】Evaluate Reverse Polish Notation 逆波兰表达式求值
- LeetCode:150. Evaluate Reverse Polish Notation(逆波兰表达式)
- 逆波兰表达式求值(Evaluate Reverse Polish Notation)
- LeetCode OJ:Evaluate Reverse Polish Notation(逆波兰表示法的计算器)
- Java Evaluate Reverse Polish Notation(逆波兰表达式)
- [Leetcode] evaluate reverse polish notation 计算逆波兰表达式
- Leetcode 150:Evaluate Reverse Polish Notation(计算逆波兰表达式) --java实现
- [LintCode] Evaluate Reverse Polish Notation 计算逆波兰表达式