求逆波兰表达式的值。
在逆波兰表达法中,其有效的运算符号包括 +
, -
, *
, /
。每个运算对象可以是整数,也可以是另一个逆波兰计数表达。
您在真实的面试中是否遇到过这个题?
Yes
样例
["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6
标签
这题浪费了大量时间,主要是对string类型不熟悉,不知道如何转变成int型,需要注意的就是负数的处理以及三个及以上连续的数字类型的操作问题。如有疑问可以留言交流,每天都看。
class Solution {
public:
/**
* @param tokens The Reverse Polish Notation
* @return the value
*/
int convert(string a){
int n=a.length();
int sum;
if(a[0]=='-'){
sum=a[1]-'0';
for(int i=2;i<n;i++){
sum=sum*10+(a[i]-'0');
}
sum=-sum;
}
else{
sum=a[0]-'0';
for(int i=1;i<n;i++){
sum=sum*10+(a[i]-'0');
}
}
return sum;
}
int evalRPN(vector<string>& tokens) {
// Write your code here
stack<string> s;
stack<int> s1;
//for(int j=0;j<tokens.size();j++){
int sum;
int n=tokens.size();
for(int i=n-1;i>=0;i--){
s.push(tokens[i]);
}
sum=convert(s.top());
s.pop();
while(!s.empty()){
if((s.top()[0]>='0'&&s.top()[0]<='9')||(s.top()[0]=='-'&&(s.top()[1]>='0'&&s.top()[1]<='9'))){
s1.push(convert(s.top()));
s.pop();
}
else if(s.top()[0]=='+'){
if(s1.size()==1){
sum+=s1.top();
s1.pop();
}
else
{
int temp=s1.top();
s1.pop();
int temp1=s1.top();
s1.pop();
s1.push(temp1+temp);
}
s.pop();
}
else if(s.top()[0]=='-')
{
if(s1.size()==1){
sum-=s1.top();
s1.pop();
}
else
{
int temp=s1.top();
s1.pop();
int temp1=s1.top();
s1.pop();
s1.push(temp1-temp);
}
s.pop();
}
else if(s.top()[0]=='*')
{
if(s1.size()==1){
sum*=s1.top();
s1.pop();
}
else
{
int temp=s1.top();
s1.pop();
int temp1=s1.top();
s1.pop();
s1.push(temp1*temp);
}
s.pop();
}
else if(s.top()[0]=='/')
{
if(s1.size()==1){
sum/=s1.top();
s1.pop();
}
else
{
int temp=s1.top();
s1.pop();
int temp1=s1.top();
s1.pop();
s1.push(temp1/temp);
}
s.pop();
}
}
return sum;
}
// }
};
如有疑问可以留言交流,每天都看博客。