Uva--327 (栈/二叉树/模拟)

2014-06-21 15:00:43

题意&思路:模拟运算表达式的计算,其中表达式包含空格,前自增(减),后自增(减)。这题是小白书推荐的二叉树题目。。。(但是没搞懂怎样建树,应该是根据中序和结束节点信息条件建树,但是不怎么会,咳咳,用栈模拟了一下)

 1 #include <cstdio>
 2 #include <stack>
 3 #include <string>
 4 #include <sstream>
 5 #include <iostream>
 6 using namespace std;
 7 struct node{
 8     int val;
 9     int chan1,chan2;
10 };
11 node n[26];
12 int main(){
13     stack<char> s;
14     string str;
15     int flag,used[26];
16     char t;
17     while(getline(cin,str)){
18         cout << "Expression: " << str << endl;
19         istringstream sin(str);
20         while(!s.empty()) s.pop();
21         for(int i = 0; i < 26; ++i){
22             n[i].val = i + 1;
23             n[i].chan1 = n[i].chan2 = 0;
24             used[i] = 0;
25         }
26         flag = 0;
27         while(sin >> t){
28             if(t == '-' || t == '+'){
29                 if(!s.empty() && s.top() == '-' && t == '-'){
30                     s.pop();
31                     if(s.empty() || s.top() == '-' || s.top() == '+') flag = -1;//before minus
32                     else n[s.top() - 'a'].chan2 = -1;//after minus
33                 }
34                 else if(!s.empty() && s.top() == '+' && t == '+'){
35                     s.pop();
36                     if(s.empty() || s.top() == '-' || s.top() == '+') flag = 1;//before plus
37                     else n[s.top() - 'a'].chan2 = 1;//after plusĶ
38                 }
39                 else //top element , a letter.
40                     s.push(t);
41             }
42             else{//a letter
43                 used[t - 'a'] = 1;
44                 n[t - 'a'].val += flag;
45                 n[t - 'a'].chan1 = flag;
46                 flag = 0;
47                 if(s.empty()){
48                     s.push(t);
49                     continue;
50                 }
51                 char op = s.top();
52                 s.pop();
53                 char fir = s.top();
54                 s.pop();
55                 if(op == '-')
56                     n[t - 'a'].val = n[fir - 'a'].val - n[t - 'a'].val;
57                 else
58                     n[t - 'a'].val = n[fir - 'a'].val + n[t - 'a'].val;
59                 s.push(t);
60             }
61         }
62         cout << "    value = " << n[(int)(s.top() - 'a')].val << endl;
63         for(int i = 0; i < 26; ++i){
64             if(used[i])
65                 cout << "    " << (char)(i + 'a') << " = " <<
66                     i + 1 + n[i].chan1 + n[i].chan2 << endl;
67         }
68     }
69     return 0;
70 }

 

posted @ 2014-06-21 15:03  Naturain  阅读(178)  评论(0)    收藏  举报