題目:
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
解題思路:
很簡單的一題,直接利用棧實現,不多說了
實現程式碼:
#include <iostream> #include <stack> #include <vector> #include <string> #include <cstdlib> using namespace std; /* 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 */ class Solution { public: int evalRPN(vector<string> &tokens) { stack<string> operand_stack; vector<string>::iterator iter; for(iter = tokens.begin(); iter != tokens.end(); ++iter) { if(*iter == "+")//這裡就不提取重複程式碼了,直接簡單點 { string op1 = operand_stack.top(); operand_stack.pop(); string op2 = operand_stack.top(); operand_stack.pop(); //int ret = atoi(op2.c_str()) + atoi(op1.c_str()); int ret = stoi(op2) + stoi(op1);//stoi為C++11才有 string result = to_string(ret); operand_stack.push(result); } else if(*iter == "-") { string op1 = operand_stack.top(); operand_stack.pop(); string op2 = operand_stack.top(); operand_stack.pop(); int ret = atoi(op2.c_str()) - atoi(op1.c_str()); string result = to_string(ret); operand_stack.push(result); } else if(*iter == "*") { string op1 = operand_stack.top(); operand_stack.pop(); string op2 = operand_stack.top(); operand_stack.pop(); int ret = atoi(op2.c_str()) * atoi(op1.c_str()); string result = to_string(ret); operand_stack.push(result); } else if(*iter == "/") { string op1 = operand_stack.top(); operand_stack.pop(); string op2 = operand_stack.top(); operand_stack.pop(); if( atoi(op1.c_str()) == 0) return 0x7FFFFFF; int ret = atoi(op2.c_str()) / atoi(op1.c_str()); string result = to_string(ret); operand_stack.push(result); } else operand_stack.push(*iter); } return atoi(operand_stack.top().c_str()); } }; int main(void) { string strs[] = {"4", "13", "5", "/", "+"}; vector<string> tokens(strs, strs+5); Solution solution; int ret = solution.evalRPN(tokens); cout<<ret<<endl; return 0; }