1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<vector>
5 using namespace std;
6 char a[105];
7 struct Node{
8 Node *lson;
9 Node *rson;
10 char data[105];
11 bool brackets = 0;
12 };
13 char b[105];
14 int num;
15 bool sign = 1;
16 vector<char>sy[6];
17 Node *Structure(){
18 Node *head, *p_node, *q_node, *d_node;
19 while(a[num] != '\0'){
20 if(a[num] == ')'){
21 num++;
22 return head;
23 }
24 if(a[num] == '('){
25 int tmp = num++;
26 sign = 1;
27 if(tmp){
28 d_node -> rson = Structure();
29 d_node -> rson -> brackets = 1;
30 }
31 else {
32 p_node = Structure();
33 sign = 1;
34 }
35 }
36 int cnt = 0;
37 while(a[num] >= '0' && a[num] <= '9' || a[num] == '.'){
38 b[cnt++] = a[num++];
39 }
40 if(cnt){
41 b[cnt] = '\0';
42 p_node = (Node*)malloc(sizeof(Node));
43 strcpy(p_node -> data, b); p_node -> lson = NULL; p_node -> rson = NULL;
44 if(!sign){
45 d_node -> rson = p_node;
46 }
47 }
48 else {
49 b[cnt++] = a[num++];b[cnt] = '\0';
50 if(sign){
51 d_node = head = (Node*)malloc(sizeof(Node));
52 strcpy(head -> data, b); head -> lson = p_node;
53 sign = 0;
54 }
55 else {
56 q_node = head;
57 d_node = (Node*)malloc(sizeof(Node));
58 strcpy(d_node -> data, b);
59 while(1){
60 bool flag = 0;
61 for(int i = 0; i < sy[q_node -> data[0]].size(); i++){
62 if(sy[q_node -> data[0]][i] == b[0]){
63 flag = 1;
64 break;
65 }
66 }
67 if(flag){
68 d_node -> lson = q_node;
69 if(q_node == head){
70 head = d_node;
71 }
72 else {
73 p_node -> rson = d_node;
74 }
75 break;
76 }
77 else {
78 if(q_node -> rson -> rson && !q_node -> rson -> brackets){
79 p_node = q_node;
80 q_node = q_node -> rson;
81 }
82 else{
83 d_node -> lson = q_node -> rson;
84 q_node -> rson = d_node;
85 break;
86 }
87 }
88 }
89 }
90 }
91 }
92 return head;
93 }
94 void Preorder_traversal(Node *p_node){
95 if(p_node){
96 printf("%s", p_node -> data);
97 Preorder_traversal(p_node -> lson);
98 Preorder_traversal(p_node -> rson);
99 }
100 }
101 void Inorder_traversal(Node *p_node){
102 if(p_node){
103 Inorder_traversal(p_node -> lson);
104 printf("%s", p_node -> data);
105 Inorder_traversal(p_node -> rson);
106 }
107 }
108 void Postorder_traversal(Node *p_node){
109 if(p_node){
110 Postorder_traversal(p_node -> lson);
111 Postorder_traversal(p_node -> rson);
112 printf("%s", p_node -> data);
113 }
114 }
115 double Number(char ch[105]){
116 return atof(ch);
117 }
118 char *Charater_string(double x){
119 char ch[105];
120 sprintf(ch, "%f", x);
121 return ch;
122 }
123 char *Count(Node *p_node){
124 if(p_node -> lson -> lson){
125 Count(p_node -> lson);
126 }
127 if(p_node -> rson -> rson){
128 Count(p_node -> rson);
129 }
130 if(p_node -> lson -> lson == NULL && p_node -> rson -> rson == NULL){
131 double x = Number(p_node -> lson -> data);
132 double y = Number(p_node -> rson -> data);
133 delete(p_node -> lson -> lson);
134 delete(p_node -> lson -> rson);
135 delete(p_node -> rson -> lson);
136 delete(p_node -> lson -> rson);
137 p_node -> lson = NULL;
138 p_node -> rson = NULL;
139 switch(p_node -> data[0]){
140 case '+': strcpy(p_node -> data, Charater_string(x+y));break;
141 case '-': strcpy(p_node -> data, Charater_string(x-y));break;
142 case '*': strcpy(p_node -> data, Charater_string(x*y));break;
143 case '/': strcpy(p_node -> data, Charater_string(x/y));break;
144 }
145 }
146 return p_node -> data;
147 }
148 int main(){
149 while(~scanf("%s", a)){
150 sy['-'].push_back('+');
151 sy['-'].push_back('-');
152 sy['*'].push_back('+');
153 sy['*'].push_back('-');
154 sy['/'].push_back('+');
155 sy['/'].push_back('-');
156 sy['/'].push_back('*');
157 sy['/'].push_back('/');
158 num = 0;
159 sign = 1;
160 Node *head = Structure();
161 puts("Preorder traversal:");
162 Preorder_traversal(head);
163 puts("");
164 puts("Inorder traversal:");
165 Inorder_traversal(head);
166 puts("");
167 puts("Postorder traversal:");
168 Postorder_traversal(head);
169 puts("");
170 puts("Computed result is ");
171 printf("%s\n", Count(head));
172 }
173 return 0;
174 }