您的位置:首页 > 编程语言 > Lua

LeetCode OJ 之 Evaluate Reverse Polish Notation (求逆波兰表达式的值)

2014-12-08 10:53 441 查看

题目:

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