-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathexpression_tree.cpp
More file actions
88 lines (80 loc) · 2.36 KB
/
expression_tree.cpp
File metadata and controls
88 lines (80 loc) · 2.36 KB
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
#include <string>
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
class ExpressionTreeNode {
public:
string symbol;
ExpressionTreeNode *left, *right;
ExpressionTreeNode(string symbol) {
this->symbol = symbol;
this->left = this->right = NULL;
}
};
class Solution {
public:
ExpressionTreeNode* build(vector<string> &expression) {
stack<ExpressionTreeNode*> numbers;
stack<ExpressionTreeNode*> ops;
for (auto ele : expression) {
cout << ele << endl;
if (ele == "(") {
ops.push(new ExpressionTreeNode(ele));
} else if (ele == ")") {
while (ops.top()->symbol != "(") {
merge(numbers, ops);
}
ops.pop();
} else if (ele == "+" || ele == "-") {
while (!ops.empty() && ops.top()->symbol != "(") {
merge(numbers, ops);
}
ops.push(new ExpressionTreeNode(ele));
} else if (ele == "*" || ele == "/") {
if (!ops.empty()) {
if (ops.top()->symbol == "/" || ops.top()->symbol == "*") {
merge(numbers, ops);
}
}
ops.push(new ExpressionTreeNode(ele));
} else {
numbers.push(new ExpressionTreeNode(ele));
}
}
while (!ops.empty()) {
merge(numbers, ops);
}
if (numbers.empty()) {
return nullptr;
}
return numbers.top();
}
void merge(stack<ExpressionTreeNode*> &numbers,
stack<ExpressionTreeNode*> &ops) {
if (ops.empty()) {
return;
}
if (ops.top()->symbol == "(") {
return;
}
ExpressionTreeNode *op_top;
ExpressionTreeNode *number_top1;
ExpressionTreeNode *number_top2;
op_top = ops.top();
ops.pop();
number_top1 = numbers.top();
numbers.pop();
number_top2 = numbers.top();
numbers.pop();
op_top->right = number_top1;
op_top->left = number_top2;
numbers.push(op_top);
}
};
int main() {
Solution so;
vector<string> test{"2", "+", "3", "(", "5", "+", "(", "6", "*", "7", ")", ")"};
so.build(test);
return 0;
}