题目描述:
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
Hide Tags Stack
分析:
逆波兰式的计算规则如下:
如果是操作数,则直接压入栈中,如果是运算符,则从栈中弹出两个操作数进行运算后,将结果入栈。
本题的逆波兰是的字符串数组,因此需要注意将字符串转换为整数,同时要注意负数的转换。
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
Hide Tags Stack
分析:
逆波兰式的计算规则如下:
如果是操作数,则直接压入栈中,如果是运算符,则从栈中弹出两个操作数进行运算后,将结果入栈。
本题的逆波兰是的字符串数组,因此需要注意将字符串转换为整数,同时要注意负数的转换。
以下是C++实现代码
/*16ms//*/
class Solution {
public:
bool isOp(string s) //判断是否为运算符
{
if(s == "+" || s == "-" || s == "*" || s == "/")
return true;
return false;
}
int stoi(string s) //将字符串转换为整数,注意负数
{
int flag = 1;
int i = 0,num = 0;
if(s[0] == '-')
{
flag = -1; //标记负数
i++;
}
while(i < s.size())
{
if(isdigit(s[i]))
num = num * 10 + (s[i++] - '0');
}
return flag * num;
}
int doOp(int a,int b,string op) //进行a op b运算
{
if(op == "+")
return a + b;
else if(op == "-")
return a - b;
else if(op == "*")
return a * b;
else if(op == "/")
return a / b;
else ;
}
int evalRPN(vector<string>& tokens) {
int len = tokens.size();
//if(len == 1)
// return stoi(tokens[0]);
stack<int> s;
int i = 0;
int num = 0;
for(; i < len; i++)
{
if(!isOp(tokens[i]))
{
num = stoi(tokens[i]); //将操作数入栈
s.push(num);
}
else //如果是运算符,就从栈中弹出两个操作数,运算后将结果入栈
{
int a = 0,b = 0;
b = s.top();
s.pop();
a = s.top();
s.pop();
s.push(doOp(a,b,tokens[i]));
}
}
return s.top(); //最后栈里只有一个元素,就是最终结果
}
};