這裡,我們依然假設運算子都是二元的,這樣構造出來的表達樹必然是乙個二叉樹。對於乙個給定的字尾表示式,它表達樹的根節點是該表示式最外層的運算子。根節點的左右子樹分別為該運算子的第乙個和第二個運算元。這兩個運算元可能是樹,也可能是字尾子式對應的表達樹。
例.對於如下字尾式 ab
+ 其對應的表達樹為
+
/ \a b
例.考慮乙個稍微複雜的字尾式 ab
c−+
首先看到它的最後乙個字元是加號+,這說明這個字尾式的最外層運算是加法運算,故而根節點為+。見下圖。
+
/ \
加號之前的字串ab
c−表示了這個加法運算的兩個運算元。
按照字尾式的性質,最後乙個字元-一定是屬於加法運算的第二個運算元。由於第二個運算元以運算子結尾,所以它也是乙個字尾式。見下圖。
+
/ \/ -
/ \
接下來, 字串ab
c 中包含了減法運算的兩個運算元,和加法運算的第乙個運算元。根據字尾式的性質,最右邊的字元
c 屬於減法運算的第二個運算元,而字元
b屬於減法運算的第乙個運算元。最後a屬於加法運算的第乙個運算元。見下圖。
+
/ \/ -
a / \
b c
注意:在字尾式的表達樹中,每乙個運算子對應的是表達樹的非葉子節點,而每個字母,對應的是表達樹的葉子節點。在構造字尾式的表達樹時,我們總是把字串中的最後乙個字元放在表達樹中最右邊的非滿節點下。
例.考慮下面的複雜的例子 ab
c∗+d
ef−∗
g/+h
ij∗−
− 首先最右邊的字元是減號,構造根節點如下圖,剩下的字串為ab
c∗+d
ef−∗
g/+h
ij∗−
。
-
/ \
在字串ab
c∗+d
ef−∗
g/+h
ij∗−
中,最右邊的字元為減號-,放到根節點下得下圖,剩下的字串為ab
c∗+d
ef−∗
g/+h
ij∗ 。
-
/ \ -
/ \
在字串ab
c∗+d
ef−∗
g/+h
ij∗ 中,最右邊的字元為乘號,放在最右邊的減號下得下圖,剩下的字串為ab
c∗+d
ef−∗
g/+h
ij。
-
/ \ -
/ \
*/ \
將字串ab
c∗+d
ef−∗
g/+h
ij最右邊的兩個字元ij
放在最右邊的乘號下得下圖。剩下的字串為ab
c∗+d
ef−∗
g/+h
-
/ \ -
/ \
*/ \ i j
接下來,節點i和j是葉子節點,乘號節點已經滿了,因此最右邊的非滿節點為第二層的減號節點。故應該將字串ab
c∗+d
ef−∗
g/+h
的最後乙個字元
h 放到該節點下。見下圖。剩下的字串為ab
c∗+d
ef−∗
g/+
-
/ \ -
/ \
h *
/ \ i j
接下來,唯一的非滿節點是根節點。這表示根節點的第二個運算元已經生成完畢。我們將最右邊的加號字元放到根節點下,得到下圖。剩下的字串為ab
c∗+d
ef−∗
g/。
-
/ \/ \
/ \
+ -
/ \ / \
h *
/ \i j
接下來,唯一非滿的節點為根號節點,故將字串ab
c∗+d
ef−∗
g/中最右邊的字元除號
/ 放在加號節點下得下圖。剩下的字串為ab
c∗+d
ef−∗
g。
-
/ \/ \
/ \
+ -
/ \ / \
(/) h * 注意:這一行的/表示除號。
/ \ / \
i j
字串ab
c∗+d
ef−∗
g 中最後兩個字元放在表達樹第三層最左邊的乘號下得下圖。剩餘的字串為ab
c∗+d
ef−
-
/ \/ \
/ \
+ -
/ \ / \
(/) h * 注意:這一行的/表示除號。
/ \ / \
* g i j
/ \
將字串ab
c∗+d
ef− 最右邊的子串de
f−依次填進表達樹得下圖。剩下的字串為ab
c∗+
-
/ \/ \
/ \
+ -
/ \ / \
(/) h * 注意:這一行的/表示除號。
/ \ / \
* g i j
/ \d -
/ \e f
最後得到的表達樹為
-
/ \/ \
/ \
/ \
/ \
/ \
+ -
/ \ / \
/ \ / \
/ \ / \
/ \ / \
/ \ / \
+ (/) h * 注意:這一行的/表示除號。
/ \ / \ / \
a * * g i j
/ \ / \
b c d -
/ \e f
一旦字尾表示式的表達樹生成好了,那麼字尾表示式的運算可以通過自底向上的方法實現。這裡僅以乙個簡單的例子作為說明。
前面已經介紹過字尾式 ab
c−+
的生成樹為
+
/ \/ -
a / \
b c
現在假設 a=
9,b=
7,c=
2.
於是表達樹變為
+
/ \/ -
9 / \
7 2
先計算以減號為根節點的子樹,即7−
2=5 。於是表達樹變為
+
/ \9 5
最後結果為14。 字尾表示式 中綴到字尾表示式
輸入空格跳出迴圈 while k getchar n 字尾表示式 此 僅限於0 9內的加減乘除 include include include define long 10 using namespace std typedef struct stack qstack void init qstac...
表示式求值與字尾表示式
乙個算術表示式,含有數字 為簡化處理,數字只有一位 運算子 以及括號,求表示式的值。給出的表示式是一般我們見到的中綴表示式,即運算子位於運算元之間。如果把中綴表示式轉化為字尾表示式,那麼對字尾表示式求值將會很方便。字尾表示式特點 1.操作符位於運算元之後 2.沒有括號 3.運算子沒有優先順序。中綴表...
字首表示式 與 字尾表示式
在計算機程式設計中,我們使用字首或字尾表示式進行運算往往比中綴簡單 中綴表示式 1 2 3 4 5 字首表示式 1 2 3 4 5 字尾表示式 1 2 3 4 5 對於字首表示式 1 2 3 4 5,這裡的字首指的是運算符號字首,1 2 3 4 5 2 3 4 1 5可見連括號都省了。程式設計運算字...