150. 逆波兰表达式求值 - 力扣(LeetCode)
思路:定义一个名为 Solution 的类,并在其中定义了一个名为 evalRPN 的公共函数。这个函数接受一个由字符串组成的向量 tokens 作为输入,并返回一个整数。
在代码中,首先定义了一个栈 st,用于存储运算过程中的中间结果。
接下来,代码使用一个 for 循环遍历 tokens 中的每个字符串。在循环中,首先判断字符串是否为运算符(+、-、*、/),如果是,则进行相应的运算。具体来说,先将栈顶的两个数 pop 出来,然后根据运算符进行加、减、乘、除等运算,并将结果 push 回栈中。
如果遇到的字符串不是运算符,则直接将其转换为整数,并 push 入栈中。
最后,代码返回栈顶的数值,即最终的计算结果。
如果用这个代码就是测试用列就通不过:
class Solution {
public:int evalRPN(vector<string>& tokens) {
stack<int> st;for(auto str:tokens)
{if( str=="+"||str=="-"||str=="*"||str=="/")
{int left=st.top();st.pop();int right=st.top();st.pop();switch(str[0])
{case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
else
{st.push(stoi(str));
}
}
return st.top();}
};
这个代码就过了:
class Solution {
public:int evalRPN(vector<string>& tokens) {
stack<int> st;for(auto str:tokens)
{
if(str=="+"||str=="-"||str=="*"||str=="/"
)
{int left=st.top();st.pop();int right=st.top();st.pop();switch(str[0])
{case '+':
st.push(left+right);
break;
case '-':
st.push(left-right);
break;
case '*':
st.push(left*right);
break;
case '/':
st.push(left/right);
break;
}
}
else
{st.push(stoi(str));
}
}
return st.top();}
};class Solution {
public:int evalRPN(vector<string>& tokens) {stack<int> st;for(auto str:tokens)
{if( str=="+"||str=="-"||str=="*"||str=="/"){int right=st.top();st.pop();int left=st.top();st.pop();switch(str[0]){case '+':st.push(left+right);break;case '-':st.push(left-right);break;case '*':st.push(left*right);break;case '/':st.push(left/right);break;}}else{st.push(stoi(str));}}
return st.top();}
};
两段代码的区别:
int left=st.top();st.pop();int right=st.top();st.pop();int right=st.top();st.pop();int left=st.top();st.pop();
我刚开始以为left right就是两个变量,随便哪个先定义无所谓,但是下面的运算中有"/",left和right谁先出栈谁就在前面作为被除数,谁作为被输数会影响到结果。