Presentation is loading. Please wait.

Presentation is loading. Please wait.

中序轉後序 藉由由左向右掃瞄中序運算式產生後序運算式,遇到 運算元就直接輸出,遇到運算符號則先存入堆疊,將 優先權較高者輸出。 範例: a + b * c TokenStack [0] [1] [2] topoutput aa ++0a b+0ab *+ *1ab c+ *1abc eosabc*+

Similar presentations


Presentation on theme: "中序轉後序 藉由由左向右掃瞄中序運算式產生後序運算式,遇到 運算元就直接輸出,遇到運算符號則先存入堆疊,將 優先權較高者輸出。 範例: a + b * c TokenStack [0] [1] [2] topoutput aa ++0a b+0ab *+ *1ab c+ *1abc eosabc*+"— Presentation transcript:

1

2 中序轉後序 藉由由左向右掃瞄中序運算式產生後序運算式,遇到 運算元就直接輸出,遇到運算符號則先存入堆疊,將 優先權較高者輸出。 範例: a + b * c TokenStack [0] [1] [2] topoutput aa ++0a b+0ab *+ *1ab c+ *1abc eosabc*+ opispicp (020 )19 +12 – *13 / % eos00

3 後序運算式計算 由左向右掃描,在找到運算符號前先將運算元存入堆 疊,直到遇到運算符號,再從堆疊中取出所需的運算 元,執行運算後,再存回堆疊。 範例: 62/3-42*+ TokenStack [0] [1] [2] Top 62/3-42*+62/3-42*+ 6 6 2 6/2 6/2 3 6/2-3 6/2-3 4 6/2-3 4 2 6/2-3 4*2 6/2-3 +4*2 010101210010101210

4 練習一 請使用 link list 的方式儲存讀入的運算元以及運算符 號,並依我們自訂的優先權順序,完成一中序轉後 序程式。 在程式中, link list 若有 node 要刪除,不可使用 free( 要刪除的 node) 。 增加一個 list 用來收集所有不需要的 node ,每當需要 新增 node 時,便到此 list 去尋找是否有人使用的 node 可以使用,只有在 list 是空的時候, 我們使用 malloc 去建立一個新 node 。 如何收集及使用已被丟棄的 node 請看P.8

5 優先權 opispicp (020 )19 +14 –13 *12 /11 %10 eos00

6 練習二 請完成一程式,將練習一算出的後序運算式計算出答 案。

7 繳交日期 程式 demo:4/29 (三) 於實習課

8 Functions for Representation of Polynomials Let avail be a variable of type poly_pointer that points to the first node in our list of freed nodes. ( avail 指向 ” 釋放的 ” 串列的第一個 ) Instead of using malloc and free, we now use get_node and ret_node. ( 相對於 malloc 和 free, 我們現在使用 get_node 和 ret_node ) To avoid the special case of zero polynomials, we introduce a header node into each polynomial. ( 為了處理一些特別情況, 我們在每一個多項式中加入 header node ) Each polynomial, zero or nonzero, contains one additional node. 8 avail NULL list of freed nodes

9 -- Example Polynomials with header nodes (a) Zero polynomial (b) 3x 14 + 2x 8 + 1 3142810 header --

10 Program 4.12 : get_node function 10 poly_pointer get_node(void) { /* provide a node for use */ poly_pointer node; if (avail) { node = avail; avail = avail → link; } else { node = (poly_pointer) malloc(sizeof(poly_node)); if (IS_FULL(node)) { fprintf(stderr, “The memory is full\n”); exit(1); } return node; } avail NULL node 1 2

11 Program 4.13 : ret_node function 11 void ret_node(poly_pointer ptr) { /* return a node to the available list */ ptr → link = avail; avail = ptr; } avail NULL ptr 1 2

12 Program 4.14 : Erasing a circular list 12 void cerase(poly_pointer *ptr) { /*erase the circular list ptr */ poly_poitner temp; if (*ptr) { temp = (*ptr) → link; (*ptr) → link = avail; avail = temp; *ptr = NULL; } avail NULL prt temp 1 2 3


Download ppt "中序轉後序 藉由由左向右掃瞄中序運算式產生後序運算式,遇到 運算元就直接輸出,遇到運算符號則先存入堆疊,將 優先權較高者輸出。 範例: a + b * c TokenStack [0] [1] [2] topoutput aa ++0a b+0ab *+ *1ab c+ *1abc eosabc*+"

Similar presentations


Ads by Google