ACM:樹的變換,根據運算式建立運算式樹狀架構

來源:互聯網
上載者:User

標籤: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;}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.