標籤:style blog 2014 os 表 name
題目:輸入一個運算式,建立一個運算式樹狀架構!
分析:找到最後計算的運算子(它是整棵運算式樹狀架構的根),然後遞迴處理!
在代碼中,只有當p==0的時候,才考慮這個運算子,因為括弧裡的運算子一定不是最後計算的,應當忽略!
由於加減跟乘除都是左結合的,最後一個運算子才是最後計算的,所以用兩個變數c1跟c2分別記錄在括弧外面的“最右”出現的加減號和乘除號。
#include <iostream>#include <string>using namespace std;const int MAXN = 1000;string str; //運算式int lch[MAXN], rch[MAXN]; //每個節點的左右兒子節點編號char op[MAXN]; //每個節點裡面的字元int nc = 0; //代表節點個數int build_tree(string s, int x, int y) {int p = 0, c1 = -1, c2 = -1; //c1和c2分別記錄最右出現的加減號和乘除號,前提是他們在括弧外面,因為如果在括弧裡面的話,這個運算子肯定不是最後一個計算的!int u;if(y - x == 1) { //如果僅有一個字元,那麼建立單獨節點!u = ++nc;lch[u] = 0;rch[u] = 0;op[u] = s[x];return u;}for(int i = x; i < y; ++i) { //找括弧外面的最右邊的加減號跟乘除號,位置分別由c1跟c2記錄!switch(s[i]) {case '(' : ++p; break;case ')' : --p; break;case '+' : case '-' : if(!p) {c1 = i; break;} //如果這個 “+” 或者這個 “-” 是在括弧外面的!case '*' : case '/' : if(!p) {c2 = i; break;} //如果這個 “*” 或者這個 “/” 是在括弧外面的!} }if(c1 < 0) c1 = c2; //如果括弧外面沒有加減號,那就只能考慮括弧外面的乘除號了。if(c1 < 0) return build_tree(str, x+1, y-1); //如果括弧外面加減乘除號都沒有,那意思就是整個運算式被一個括弧包圍了。u = ++nc; lch[u] = build_tree(str, x, c1); //運算子s[c1]的左子樹區間是[x, c1],右子樹區間是[c1+1, y]rch[u] = build_tree(str, c1+1, y);op[u] = s[c1];return u;}int main() {cin >> str;build_tree(str, 0, str.size());for(int i = 1; i < nc+1; ++i) {cout << lch[i] << " " << rch[i] << " " << op[i] << endl;}return 0;}