【T2】
英文题目: 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
中文题目:用反波兰符号计算算术表达式的值。有效的运算符为+、-、*、/。每个操作数可以是整数或其他表达式。
这是一道关于栈的练习题
解决思路就是我们可以依次读取容器中的字符串,对读到的数字或者操作符进行不同的操作,直到将字符串读取完毕。
-
如果读到是数字:
利用c_str()函数返回一个指向正规C字符串的指针, 内容与string串相同.,这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。再利用atoi()将字符串转为整型存在一个整型的操作数栈中。 -
如果读到是四种运算符:
则均分别从栈顶取出来两个操作数,进行运算符操作,将得到的运算结果再放到操作数中。这里要注意,先取出来的是后操作的。
循环完后,最后栈顶存的就是结果啦
代码如下:
class Solution {
public:
int evalRPN(vector<string> &tokens) {
int result;
stack<int> opd; //存储操作数
for(int i=0;i<tokens.size();i++){
//共5种判断:* + - \ 操作数
if(tokens[i]=="*")
{
int rOpd = opd.top(); //右操作数
opd.pop();
int lOpd = opd.top(); //左操作数
opd.pop();
result = lOpd*rOpd;
opd.push(result);
}
else if(tokens[i]=="/")
{
int rOpd = opd.top();
opd.pop();
int lOpd = opd.top();
opd.pop();
result = lOpd/rOpd;
opd.push(result);
}
else if(tokens[i]=="+")
{
int rOpd = opd.top();
opd.pop();
int lOpd = opd.top();
opd.pop();
result = lOpd+rOpd;
opd.push(result);
}
else if(tokens[i]=="-")
{
int rOpd = opd.top();
opd.pop();
int lOpd = opd.top();
opd.pop();
result = lOpd-rOpd;
opd.push(result);
}
else
{
opd.push(atoi(tokens[i].c_str()));
}
}
return opd.top();
}
};
祝大葛们猪年快乐!!