由於沒有括號,只有+,-,++,--,優先級簡單,所以處理起來很簡單。
題目要求計算表達式的值以及涉及到的變量的值。
我這題使用stl的string進行實現,隨便進行練手,用string的erase刪掉全部空格,然後對++、--進行處理然後刪去,最後就只剩簡單式子了,簡單循環下就出來了。
這裡有幾個坑點:
1.erase函數刪除字符後,後面字符的下標都會發生變化,剛開始使用i++去檢查空格,結果刪除後會跳掉字符。
2.++、--的後綴處理要注意,我開了兩個數組放後綴運算的。
3.輸出的變量值是當前後自增後的數。
唉,我發現我每次寫stl,代碼都很亂哪,果然缺欠練習呢。
代碼:
#include <iostream> #include <string> using namespace std; int v[27], used[27]; int p[27], m[27]; //record the i++ i-- int main() { string str; while (getline(cin, str) != NULL) { cout << "Expression: " << str << endl; int value = 0; for (int i = 0; i < 26; i++) v[i] = i + 1, used[i] = p[i] = m[i] = 0; for (int i = 0; i < str.size();) if (str[i] == ' ') str.erase(i, 1); else i++; size_t f1, f2; while (1) { f1 = str.find("++"); if (f1 != string::npos) { if (str[f1 - 1] >= 'a' && str[f1 - 1] <= 'z') p[str[f1 -1] - 'a']++; else v[str[f1 + 2] - 'a']++; str.erase(f1, 2); } // cout << str << endl; f2 = str.find("--"); if (f2 != string::npos) { if (str[f2 - 1] >= 'a' && str[f2 - 1] <= 'z') m[str[f2 -1] - 'a']--; else v[str[f2 + 2] - 'a']--; str.erase(f2, 2); } if (f1 == string::npos && f2 == string::npos) break; // cout << str << endl; }//while // cout << value << endl; value += v[str[0] - 'a']; used[str[0] - 'a'] = 1; for (int i = 1; i < str.size(); i++) { if (str[i++] == '+') value += v[str[i] - 'a'], used[str[i] - 'a'] = 1; else value -= v[str[i] - 'a'], used[str[i] - 'a'] = 1; // cout << str[i-1] << str[i]<<' ' << value << endl; }//for cout << " value = " << value << endl; for (int i = 0; i < 26; i++) if (used[i]) cout << " " << char('a' + i) << " = "<< v[i] + p[i] + m[i] << endl; }//while return 0; } #include <iostream> #include <string> using namespace std; int v[27], used[27]; int p[27], m[27]; //record the i++ i-- int main() { string str; while (getline(cin, str) != NULL) { cout << "Expression: " << str << endl; int value = 0; for (int i = 0; i < 26; i++) v[i] = i + 1, used[i] = p[i] = m[i] = 0; for (int i = 0; i < str.size();) if (str[i] == ' ') str.erase(i, 1); else i++; size_t f1, f2; while (1) { f1 = str.find("++"); if (f1 != string::npos) { if (str[f1 - 1] >= 'a' && str[f1 - 1] <= 'z') p[str[f1 -1] - 'a']++; else v[str[f1 + 2] - 'a']++; str.erase(f1, 2); } // cout << str << endl; f2 = str.find("--"); if (f2 != string::npos) { if (str[f2 - 1] >= 'a' && str[f2 - 1] <= 'z') m[str[f2 -1] - 'a']--; else v[str[f2 + 2] - 'a']--; str.erase(f2, 2); } if (f1 == string::npos && f2 == string::npos) break; // cout << str << endl; }//while // cout << value << endl; value += v[str[0] - 'a']; used[str[0] - 'a'] = 1; for (int i = 1; i < str.size(); i++) { if (str[i++] == '+') value += v[str[i] - 'a'], used[str[i] - 'a'] = 1; else value -= v[str[i] - 'a'], used[str[i] - 'a'] = 1; // cout << str[i-1] << str[i]<<' ' << value << endl; }//for cout << " value = " << value << endl; for (int i = 0; i < 26; i++) if (used[i]) cout << " " << char('a' + i) << " = "<< v[i] + p[i] + m[i] << endl; }//while return 0; }