Re: [問題] A+B+C 用堆疊法要如何轉出 ++ABC 的結果

看板Programming作者 (麵T)時間8年前 (2016/11/05 16:34), 8年前編輯推噓5(5017)
留言22則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《art1 (人,原來不是人)》之銘言: : 中序 A+B+C 要利用堆疊法轉成前序,正確答案是++ABC,因為這樣A+B才會先做 : ^ ^ : 第 第 : 二 一 : 個 個 : 加 加 : 號 號 : 可是我想不出在讀到第二個加號時要怎樣才能不把堆疊內的第一個加號趕出來 : 下一個元素 堆疊 輸出 : 無 空的 無 : C    空的    C :    +    +   C :    B    +    CB :    +    +    CB+ :    A    +    CB+A :    完成   空的   CB+A+ :  很明顯這樣一定無法輸出++ABC的答案 :  請問到底堆疊法要怎樣處理才能得出正確答案呢? 放著原來的例子 A+B+C ,先來看 X+Y 就好: X+Y 轉前序是 +XY ,這沒什麼問題,由左至右先讀三個字元 c1,c2,c3, 然後按照順序輸出 c2,c1,c3 即可。 現在令 X = A+B 那麼 +XY就變成 +(A+B)Y 這時候 A+B 還沒轉成前序, 所以如果有其他人(也就是遞迴)可以幫忙把 A+B 轉前序,就解決了! 其他例如 A+B&C*D*E 轉前序: ((A+B)&((C*D)*E)) => (&(+AB)(*(*CD)E)) => &+AB**CDE 在每個括號裡都是類似 (X)(+)(Y) 轉前序的概念 C++: 可處理 運算子為單一字元、運算元為 +-*/& 的算式 運算子優先權 (*/) > (+-) > (&) http://ideone.com/SQj8uf -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.237.93.195 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1478334879.A.66A.html ※ 編輯: noodleT (36.237.93.195), 11/05/2016 16:40:33

11/05 20:49, , 1F
&在這邊是什麼意思阿?
11/05 20:49, 1F

11/05 21:05, , 2F
就只是運算子。你也可以去除&
11/05 21:05, 2F

11/05 21:06, , 3F
二進位 0&0=0;0&1=0
11/05 21:06, 3F
※ 編輯: noodleT (36.237.93.195), 11/05/2016 21:07:40

11/05 22:02, , 4F
如果不用遞迴而用堆疊來做呢?
11/05 22:02, 4F

11/06 00:39, , 5F
我瞭解了,轉前序時不能使用跟轉後序一樣的
11/06 00:39, 5F

11/06 00:40, , 6F
規則,也就是進堆疊的優先權只有在大於堆疊
11/06 00:40, 6F

11/06 00:41, , 7F
說錯,應該是小於,才需要把堆疊內的運算子
11/06 00:41, 7F

11/06 00:41, , 8F
小於堆疊內運算子的優先權時才把堆疊內的運
11/06 00:41, 8F

11/06 00:41, , 9F
算子輸出,而等於時可以繼續疊上去
11/06 00:41, 9F

11/06 00:43, , 10F
找到的資料都沒特別提出這一點差異,讓我以
11/06 00:43, 10F

11/06 00:43, , 11F
為跟後序一樣只要小於等於時就要輸出運算子
11/06 00:43, 11F

11/06 10:06, , 12F
這其實是左結合和右結合的差別
11/06 10:06, 12F

11/06 10:06, , 13F
後序做右結合運算子也是要去掉等於
11/06 10:06, 13F

11/06 10:06, , 14F
這裡只是反過來而已
11/06 10:06, 14F

11/06 10:06, , 15F
右結合運算子的例子如次方
11/06 10:06, 15F

11/06 14:13, , 16F
中序轉後序時的次方優先權不是更高嗎?
11/06 14:13, 16F

11/06 14:14, , 17F
還是你是說計算後序運算式時規則要去掉等於?
11/06 14:14, 17F

11/06 16:09, , 18F
這裡講的是結合性, 同優先權時誰先做的問題
11/06 16:09, 18F

11/06 16:10, , 19F
加減和乘除是左邊先, 但次方卻是右邊先
11/06 16:10, 19F

11/06 16:10, , 20F
例如像 3^4^5 在轉後序時就要如此處理
11/06 16:10, 20F

11/06 16:11, , 21F
才能得到正確的 345^^ 而非 34^5^
11/06 16:11, 21F

11/06 23:55, , 22F
感謝解答
11/06 23:55, 22F
文章代碼(AID): #1O7PcVPg (Programming)
文章代碼(AID): #1O7PcVPg (Programming)