題目連結:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=104&page=show_problem&problem=263
題目類型: 資料結構, 二叉樹
範例輸入:
a + bb - za+b--+c++c+f--+--a f-- + c-- + d-++e
範例輸出:
Expression: a + b value = 3 a = 1 b = 2Expression: b - z
題目大意:
給一個運算式, 運算式的變數由26個小寫字母組成,這26個字母按順序的初始值分為為1,2,3,……26,並且運算式中一個變數不會重複出現。 操作符由+, -, ++, -- (自增和自減有首碼和尾碼)。
然後輸出這個運算式的值,和每個出現的變數計算之後的值
解題思路:
因為是資料結構專題, 最開始的時候自然想到的是建樹的方法來做。
本文URL地址:http://www.bianceng.cn/Programming/sjjg/201410/45529.htm
想好方法之後, 開始敲代碼。 等到把建樹的代碼敲完後, 並且準備計算結果時, 發現其實這一題並不需要建樹也完全可以,而且更加簡單。
不管是什麼方法, 解題的基本思路是, 先把運算式的首碼尾碼++, --處理掉, 那後從左至右計算就結果就行了。
下面是非建樹版的代碼:
#include<iostream> #include<cstdio> #include<cctype> #include<cstring> #include<deque> #include<vector> #include<algorithm> using namespace std; vector<char>var; deque<int>que; const int MAXN = 120; char str[MAXN]; int val[26]; // 用來儲存a,b,……z的初始值 int increment; // 對輸入的字串進行過濾,消去空格 void Filter(){ int pos=0; for(int i=0; i<strlen(str); ++i){ if(str[i] != ' '){ str[pos++] = str[i]; } } str[pos] = 0; // 字串結束標誌'\0' } // 是否有首碼 inline bool havePrefix(int i){ if(str[i-1]=='+'&&str[i-2]=='+' || str[i-1]=='-'&&str[i-2]=='-') return true; return false; } // 是否有尾碼 inline bool haveSuffix(int i){ if(str[i+1]=='+'&&str[i+2]=='+' || str[i+1]=='-'&&str[i+2]=='-') return true; return false; } void PreProsess(){ increment = 0; while(!que.empty()) que.pop_back(); var.clear(); for(int i=0; i<strlen(str); ++i){ if(str[i]>='a' && str[i]<='z'){ // 有首碼 var.push_back(str[i]); // 把該字母存入 if(i>=2 && havePrefix(i)){ if(str[i-1]=='+') ++val[str[i]-'a']; else --val[str[i]-'a']; int n = val[str[i]-'a']; que.push_back(n); str[i-1]=str[i-2] = ' '; } // 有尾碼 else if(i<=strlen(str)-3 && haveSuffix(i)){ int n = val[str[i]-'a']; que.push_back(n); if(str[i+1]=='+'){ ++val[str[i]-'a']; --increment; } else{ --val[str[i]-'a']; ++increment; } str[i+1] = str[i+2] = ' '; } else { int n = val[str[i]-'a']; que.push_back(n); } } } } int GetSum(){ for(int i=0; i<strlen(str); ++i){ if(str[i]=='+' || str[i]=='-'){ int a=que.front(); que.pop_front(); int b=que.front(); que.pop_front(); if(str[i]=='+') que.push_front(a+b); else que.push_front(a-b); } } return que.front(); } void Solve(){ // 給a,b,c……z 初始值 for(int i=0; i<26; ++i){ val[i] = i+1; } Filter(); PreProsess(); int sum = GetSum(); // puts(str); printf(" value = %d\n", sum); sort(var.begin(), var.begin()+var.size()); for(int i=0; i<var.size(); ++i){ printf(" %c = %d\n",var[i], val[var[i]-'a']); } // printf("\n"); } int main(){ freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); while(gets(str)){ printf("Expression: %s\n", str); Solve(); } return 0; }