LeetCode - Evaluate Reverse Polish Notation
12607 단어 LeetCode
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 };
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python 문자열 입력으로 모든 유효한 IP 주소 생성(LeetCode 93번 문제)이 문제의 공식 난이도는 Medium으로 좋아요 1296, 반대 505, 통과율 35.4%를 눌렀다.각 항목의 지표로 말하자면 보기에는 약간 규범에 맞는 것 같지만, 실제로도 확실히 그렇다.이 문제의 해법과 의도는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.