-
Notifications
You must be signed in to change notification settings - Fork 0
/
150.evaluate-reverse-polish-notation.cpp
140 lines (131 loc) · 3.42 KB
/
150.evaluate-reverse-polish-notation.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
* @lc app=leetcode id=150 lang=cpp
*
* [150] Evaluate Reverse Polish Notation
*
* https://leetcode.com/problems/evaluate-reverse-polish-notation/description/
*
* algorithms
* Medium (37.48%)
* Likes: 1445
* Dislikes: 508
* Total Accepted: 268.6K
* Total Submissions: 709.5K
* Testcase Example: '["2","1","+","3","*"]'
*
* Evaluate the value of an arithmetic expression in Reverse Polish Notation.
*
* Valid operators are +, -, *, /. Each operand may be an integer or another
* expression.
*
* Note:
*
*
* Division between two integers should truncate toward zero.
* The given RPN expression is always valid. That means the expression would
* always evaluate to a result and there won't be any divide by zero
* operation.
*
*
* Example 1:
*
*
* Input: ["2", "1", "+", "3", "*"]
* Output: 9
* Explanation: ((2 + 1) * 3) = 9
*
*
* Example 2:
*
*
* Input: ["4", "13", "5", "/", "+"]
* Output: 6
* Explanation: (4 + (13 / 5)) = 6
*
*
* Example 3:
*
*
* Input: ["10", "6", "9", "3", "+", "-11", "*", "/", "*", "17", "+", "5", "+"]
* Output: 22
* Explanation:
* ((10 * (6 / ((9 + 3) * -11))) + 17) + 5
* = ((10 * (6 / (12 * -11))) + 17) + 5
* = ((10 * (6 / -132)) + 17) + 5
* = ((10 * 0) + 17) + 5
* = (0 + 17) + 5
* = 17 + 5
* = 22
*
*
*/
// @lc code=start
class Solution {
public:
int evalRPN1(vector<string>& tokens) {
vector<int> st;
for (int i = 0; i < tokens.size(); ++i) {
if (tokens[i] == "+" || tokens[i] == "/" || tokens[i] == "*" || tokens[i] == "-"){
int curNum1 = st.back();
st.pop_back();
int curNum2 = st.back();
st.pop_back();
st.push_back(getResult(tokens[i], curNum2, curNum1));
} else
st.push_back(atoi(tokens[i].c_str()));
}
return st[0];
}
int getResult(string& notation, int curNum1, int curNum2) {
if (notation == "/")
return curNum1 / curNum2;
else if (notation == "*")
return curNum1 * curNum2;
else if (notation == "-")
return curNum1 - curNum2;
return curNum1 + curNum2;
}
int evalRPN(vector<string>& tokens) {
stack<int> numSt;
for (int i = 0; i < tokens.size(); ++i) {
if(isNum(tokens[i])) {
numSt.push(to_int(tokens[i]));
} else {
int b = numSt.top();
numSt.pop();
int a = numSt.top();
numSt.pop();
numSt.push(cal(a, b, tokens[i]));
}
}
return numSt.top();
}
bool isNum(const string& s) {
if (s.size() == 1 && (s[0] == '-' || s[0] == '+' || s[0] == '*' || s[0] == '/'))
return false;
return true;
}
int cal(int a, int b, string token) {
if (token == "+")
return a + b;
else if (token == "-")
return a - b;
else if (token == "/")
return a / b;
else if (token == "*")
return a * b;
return 0;
}
int to_int(string s) {
int sum = 0;
int sign = 1;
for (const auto& ele : s) {
if (ele == '-')
sign = -1;
else
sum = sum * 10 + (ele - '0');
}
return sign * sum;
}
};
// @lc code=end