Decode360's Blog

          業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          前/中/后綴表達(dá)式的轉(zhuǎn)換
          ?
          ?
          ??? 自然表達(dá)式轉(zhuǎn)換為前/中/后綴表達(dá)式,其實(shí)是很簡單的。首先將自然表達(dá)式按照優(yōu)先級順序,構(gòu)造出與表達(dá)式相對應(yīng)的二叉樹,然后對二叉樹進(jìn)行前/中/后綴遍歷,即得到前/中/后綴表達(dá)式。
          ?
          ??? 舉例說明將自然表達(dá)式轉(zhuǎn)換成二叉樹:
          ?
          ??? a×(b+c)-d
          ?
          ??? ① 根據(jù)表達(dá)式的優(yōu)先級順序,首先計(jì)算(b+c),形成二叉樹
          ??? tree1.JPG
          ???
          ??? 然后是a×(b+c),在寫時(shí)注意左右的位置關(guān)系
          ??? tree2.JPG
          ?
          ??? 最后在右邊加上 -d
          ??? tree3.JPG
          ?
          ?
          ??? 然后最這個(gè)構(gòu)造好的二叉樹進(jìn)行遍歷,三種遍歷的順序分別是這樣的:
          ?
          ??? ① 前序遍歷:根-左-右
          ??? 中序遍歷:左-根-右
          ??? 后序遍歷:左-右-根
          ?
          ??? 所以還是以剛才的這個(gè)例子,在最終二叉樹的基礎(chǔ)上可以得出:
          ?
          ??? 前綴表達(dá)式:-*a+bcd
          ??? 中綴表達(dá)式:a*b+c-d
          ??? 后綴表達(dá)式:abc+*d-
          ?
          ?
          ?
          ??? 一些其他的遍歷原則:
          ?
          ??? 1、深度優(yōu)先遍歷:
          ?
          ??? 首先訪問出發(fā)點(diǎn)V,并將其標(biāo)記為已訪問過;然后依次從V出發(fā)搜索V的每個(gè)鄰接點(diǎn)W。若W未曾訪問過,則以W為新的出發(fā)點(diǎn)繼續(xù)進(jìn)行深度優(yōu)先遍歷,直至圖中所有和源點(diǎn)V有路徑相通的頂點(diǎn)(亦稱為從源點(diǎn)可達(dá)的頂點(diǎn))均已被訪問為止。若此時(shí)圖中仍有未訪問的頂點(diǎn),則另選一個(gè)尚未訪問的頂點(diǎn)作為新的源點(diǎn)重復(fù)上述過程,直至圖中所有頂點(diǎn)均被訪問為止。
          ?
          ??? 2、廣度優(yōu)先遍歷:
          ?
          ??? 首先訪問出發(fā)頂點(diǎn)V,然后訪問與頂點(diǎn)V鄰接的全部未被訪問過的頂點(diǎn)W0,W1,...WK-1;接著再依次訪問與頂點(diǎn)W0,W1,...WK-1鄰接的全部未被訪問過的頂點(diǎn),以此類推,直至圖的所有頂點(diǎn)都被訪問到,或出發(fā)頂點(diǎn)V所在的連通分量的全部頂點(diǎn)都被訪問到為止。
          ?
          ??? 注:對于樹來說,深度優(yōu)先就是從左到右,從上到下;廣度優(yōu)先就是從上到下,從左到右。
          ?




          -The End-

          posted on 2009-05-21 22:41 decode360-3 閱讀(7685) 評論(3)  編輯  收藏 所屬分類: Exam

          評論

          # re: 前/中/后綴表達(dá)式的轉(zhuǎn)換 2012-09-02 14:18 captivated
          LZ: 你怎么根據(jù)中綴表達(dá)式構(gòu)建你的二叉樹先.

          二叉樹構(gòu)建出來后, 前序遍歷就是前綴表達(dá)式, 中序遍歷就是中綴表達(dá)式, 后序遍歷就是逆波蘭式 -- 問題是, 你需要先把二叉樹構(gòu)建出來.

          事實(shí)上, 這樣的二叉樹, 需要先將中綴表達(dá)式轉(zhuǎn)換為逆波蘭式, 然后才能構(gòu)建出來(別的方法 -- 我反正沒試過也不知道). 中綴表達(dá)式轉(zhuǎn)換為逆波蘭式倒不是太麻煩, 用棧. 逆波蘭式表達(dá)式構(gòu)建出二叉樹也是用棧, 都不是很麻煩.

          所以前提是需要通過棧將中綴表達(dá)式轉(zhuǎn)換為逆波蘭式. 另外, 以一個(gè)簡單的計(jì)算器程序?yàn)槔? 這個(gè)程序要能夠計(jì)算形如
          1.23 * (3.2 + 5.6) / 5 + 4.0 ( 5.8 - 2.4)
          這種表達(dá)式的結(jié)果. 要求通過上面提及的轉(zhuǎn)換來寫(嗯, 有別的更簡單的方法來寫這種計(jì)算器程序. 比如遞歸).
          LZ提過轉(zhuǎn)換很簡單明了, 不過我建議LZ不妨編碼試試.

          -----------------------------------------------------

          不得不說. 其實(shí)我自己常對這樣的轉(zhuǎn)換過程本身感到非常惱火, 覺得自己的大腦常常因?yàn)檫@種轉(zhuǎn)換過程本身而宕機(jī)(關(guān)于那個(gè)計(jì)算器程序, 我用過三種方法編碼完成過).

          -----------------------------------------------------

            回復(fù)  更多評論
            

          # re: 前/中/后綴表達(dá)式的轉(zhuǎn)換 2013-11-22 16:22 劉濤
          轉(zhuǎn)換過程一般在實(shí)際當(dāng)中什么時(shí)候要用。  回復(fù)  更多評論
            

          # re: 前/中/后綴表達(dá)式的轉(zhuǎn)換 2013-11-22 16:23 劉濤
          問題@劉濤
            回復(fù)  更多評論
            

          主站蜘蛛池模板: 贺兰县| 阳原县| 正镶白旗| 栖霞市| 曲阳县| 新田县| 徐汇区| 临高县| 阿拉尔市| 普兰店市| 依安县| 炎陵县| 邵阳县| 宣恩县| 沅江市| 志丹县| 岗巴县| 毕节市| 龙门县| 胶州市| 历史| 青铜峡市| 修文县| 金溪县| 浪卡子县| 鱼台县| 酒泉市| 新丰县| 芷江| 日照市| 沙湾县| 德兴市| 旬阳县| 朝阳市| 禹州市| 嘉禾县| 潜江市| 兴文县| 武胜县| 丘北县| 玉溪市|