思路:
这题都把用栈直说出来了,用啊,为什么不用!其实之前学习数据结构的时候应该也已经做过了相应的题目了,这个属于简不带小数点简化版,难度下降了不少(第一次做被干碎的恐惧
首先逆波兰表达式就是后缀表达式,这个不知道先上网搜下,不难。
之后就是处理数据了,首先说对数字的处理:先考虑正负数,如果是负数则从第一位遍历,再取相反数。数字是字符串的形式,要按位遍历,每次都将最高位*10再加上当前位置的数字(别忘了减‘0’,这是因为char是字符型,是ASCII码的形式,而要转换为真正的数字,差一个'0'),处理之后入栈。
然后就是分析现在是哪个符号了,根据不同的符号做出不同的操作,先出栈两个数字,再计算后入栈即可,最后返回top的值。
代码如下:
class Solution {
public:
stack<int> stk;
void Num(string s)
{
int num = 0;
if(s[0] != '-')
{
for(int i = 0; i < s.size(); i++)
num = (num*10) + s[i] - '0';
}
else
{
for(int i = 1; i < s.size(); i++)
num = (num*10) + s[i] - '0';
num = -num;
}
stk.push(num);
}
void Calculate(string optr)
{
int x = stk.top();
stk.pop();
int y = stk.top();
stk.pop();
if(optr == "+")
stk.push(x + y);
else if(optr == "-")
stk.push(-x + y);
else if(optr == "*")
stk.push(x * y);
else if(optr == "/")
stk.push(y / x);
}
int evalRPN(vector<string>& tokens) {
for(int i = 0; i < tokens.size(); i++)
{
string temp = tokens[i];
if(temp != "+" && temp != "-"//temp是数字
&& temp != "*" && temp !="/"){
Num(temp);}
else
Calculate(temp);
}
int res = stk.top();
stk.pop();
return res;
}
};