Evaluate Reverse Polish Notation (STRING-TYPE CONVERTION)
Question
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
1ST TRY
class Solution { public: int evalRPN(vector<string> &tokens) { int operant1; int operant2; string str; int ret; bool firstOp = false; for(int i = 0; i < tokens.size(); i++) { str = tokens[i]; if(!firstOp) { operant1 = getInt(str);; firstOp = true; } else if(str == "+") { ret = operant1 + operant2; } else if(str == "-") { ret = operant1 - operant2; } else if(str == "*") { ret = operant1 * operant2; } else if(str == "/") { ret = operant1 / operant2; } else { operant2 = getInt(str); firstOp = false; } } return ret; } int getInt(string str) { int ret = 0; for(int i = 0; i < str.length(); i++) { ret = ret*10 + str[i]; } return ret; } };
2ND TRY
考虑只有一个操作数的情况
class Solution { public: int evalRPN(vector<string> &tokens) { int operant1; int operant2; string str; int ret; bool firstOp = false; for(int i = 0; i < tokens.size(); i++) { str = tokens[i]; if(!firstOp) { operant1 = getInt(str); firstOp = true; } else if(str == "+") { operant1 += operant2; } else if(str == "-") { operant1 -= operant2; } else if(str == "*") { operant1 *= operant2; } else if(str == "/") { operant1 /= operant2; } else { operant2 = getInt(str); } } return operant1; } int getInt(string str) { int ret = 0; for(int i = 0; i < str.length(); i++) { ret = ret*10 + (str[i]-'0'); } return ret; } };
Result: Wrong
Input: ["3","-4","+"]
Output: -23
Expected: -1
3RD TRY
考虑负数的情况
class Solution { public: int evalRPN(vector<string> &tokens) { int operant1; int operant2; int ret; string str; stack<int> operantStack; for(int i = 0; i < tokens.size(); i++) { str = tokens[i]; if(str == "+") { operant2 = operantStack.top(); operantStack.pop(); operant1 = operantStack.top(); operantStack.pop(); operantStack.push(operant1 + operant2); } else if(str == "-") { operant2 = operantStack.top(); operantStack.pop(); operant1 = operantStack.top(); operantStack.pop(); operantStack.push(operant1 - operant2); } else if(str == "*") { operant2 = operantStack.top(); operantStack.pop(); operant1 = operantStack.top(); operantStack.pop(); operantStack.push(operant1 * operant2); } else if(str == "/") { operant2 = operantStack.top(); operantStack.pop(); operant1 = operantStack.top(); operantStack.pop(); operantStack.push(operant1 / operant2); } else { operantStack.push(getInt(str)); } } return operantStack.top(); } int getInt(string str) { int ret = 0; bool negFlag = false; for(int i = 0; i < str.length(); i++) { if(str[i]=='-') negFlag = true; else if(negFlag) { ret = ret*10 - (str[i]-'0'); } else { ret = ret*10 + (str[i]-'0'); } } return ret; } };
Result: Accepted
4TH TRY
使用内置函数atoi将string转换成int
class Solution { public: int evalRPN(vector< string > &tokens) { stack< int > operandStack; int operand1; int operand2; for(int i = 0; i < tokens.size(); i++){ if(tokens[i]=="+"){ operand1 = operandStack.top(); operandStack.pop(); operand2 = operandStack.top(); operandStack.pop(); operand2 += operand1; operandStack.push(operand2); } else if(tokens[i]=="-"){ operand1 = operandStack.top(); operandStack.pop(); operand2 = operandStack.top(); operandStack.pop(); operand2 -= operand1; operandStack.push(operand2); } else if(tokens[i]=="*"){ operand1 = operandStack.top(); operandStack.pop(); operand2 = operandStack.top(); operandStack.pop(); operand2 *= operand1; operandStack.push(operand2); } else if(tokens[i]=="/"){ operand1 = operandStack.top(); operandStack.pop(); operand2 = operandStack.top(); operandStack.pop(); operand2 /= operand1; operandStack.push(operand2); } else{ operand1 = atoi(tokens[i].c_str()); operandStack.push(operand1); } } return operandStack.top(); } };
Result: Accepted