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 }

浙公网安备 33010602011771号