LeetCode - Evaluate Reverse Polish Notation

12607 단어 LeetCode
Evaluate Reverse Polish Notation
2014.2.25 23:42
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

Solution:
  The Reverse Polish Notation is a postorder traversal of the syntax tree, which is constructed with operands and operators.
  With a stack it would be easy to process the sequence and calculate the result.
  Total time and space complexities are both O(n).
Accepted code:
 1 // 1AC, simple training on stack operation.

 2 #include <stack>

 3 #include <vector>

 4 using namespace std;

 5 

 6 class Solution {

 7 public:

 8     int evalRPN(vector<string> &tokens) {

 9         int i, n;

10         int op1, op2;

11         stack<int> nums;

12         bool is_op;

13         

14         n = (int)tokens.size();

15         for (i = 0; i < n; ++i) {

16             is_op = false;

17             if (tokens[i].length() == 1) {

18                 switch(tokens[i][0]) {

19                 case '+':

20                 case '-':

21                 case '*':

22                 case '/':

23                     is_op = true;

24                     break;

25                 }

26             }

27             

28             if (is_op) {

29                 if (nums.size() < 2) {

30                     // not enough operands

31                     return 0;

32                 }

33                 op2 = nums.top();

34                 nums.pop();

35                 op1 = nums.top();

36                 nums.pop();

37                 switch (tokens[i][0]) {

38                 case '+':

39                     nums.push(op1 + op2);

40                     break;

41                 case '-':

42                     nums.push(op1 - op2);

43                     break;

44                 case '*':

45                     nums.push(op1 * op2);

46                     break;

47                 case '/':

48                     if (op2 == 0) {

49                         // divide by 0

50                         return 0;

51                     }

52                     nums.push(op1 / op2);

53                     break;

54                 }

55             } else {

56                 if (sscanf(tokens[i].c_str(), "%d", &op1) != 1) {

57                     // invalid integer format

58                     return 0;

59                 }

60                 nums.push(op1);

61             }

62         }

63         int result = nums.top();

64         nums.pop();

65         

66         return result;

67     }

68 };

좋은 웹페이지 즐겨찾기