利用栈进行模拟(该题的特点在于字符串转整数)
关于字符串转整数,你可以用内置的C风格转法atoi函数,也可以用stringstream流,当然也可以自己写。
手写转
class Solution {
public:
//从左往右扫描入栈,遇到运算符出栈两个元素进行运算(唯一不同在于每个元素都是字符串,所以需要转数字),并将运算结果压入栈中
int evalRPN(vector<string>& tokens) {
stack<int>St;
for(int i=0;i<tokens.size();i++){
if(check(tokens[i])){
//注意先出栈的应该是除数等
int b = St.top();
St.pop();
int a = St.top();
St.pop();
switch(tokens[i][0]){
case '+':
St.push(a+b);
break;
case '-':
St.push(a-b);
break;
case '*':
St.push(a*b);
break;
case '/':
St.push(a/b);
break;
}
}else{
St.push(to_digit(tokens[i]));
}
}
int res;
res = St.top();
return res;
}
int to_digit(string &s){
int res = 0;
int j = 0;
//记录符号
bool sign = false;
if(s[0]=='-'){
sign = true;
j=1;}
for(int i=j;i<s.size();i++){
res = 10*res+(s[i]-'0');
}
if(sign)
return -res;
return res;
}
bool check(string& s){
if(s=="+"||s=="-"||s=="*"||s=="/")
return true;
return false;
}
};
利用 stringstream流转
class Solution {
public:
//从左往右扫描入栈,遇到运算符出栈两个元素进行运算(唯一不同在于每个元素都是字符串,所以需要转数字),并将运算结果压入栈中
int evalRPN(vector<string>& tokens) {
stack<int>St;
for(int i=0;i<tokens.size();i++){
if(check(tokens[i])){
//注意先出栈的应该是除数等
int b = St.top();
St.pop();
int a = St.top();
St.pop();
switch(tokens[i][0]){
case '+':
St.push(a+b);
break;
case '-':
St.push(a-b);
break;
case '*':
St.push(a*b);
break;
case '/':
St.push(a/b);
break;
}
}else{
St.push(to_digit(tokens[i]));
}
}
int res;
res = St.top();
return res;
}
int to_digit(string &s){
int c;
stringstream ss;
ss<<s;
ss>>c;
return c;
}
bool check(string& s){
if(s=="+"||s=="-"||s=="*"||s=="/")
return true;
return false;
}
};