線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2841
推到 Plurk!
推到 Facebook!

具優先權演算的計算機

 
Coffee
版主


發表:31
回覆:878
積分:561
註冊:2006-11-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-01-10 10:17:08 IP:203.73.xxx.xxx 未訂閱
這是大學時的作業,不要來跟我要Source..它不見了XD
暫時也沒打算重寫,純粹提供給需要參考使用中序轉後序寫具有優先權運算的計算機的參考
好有點小bug..不過因為年代久遠,所以我已經忘了是什麼問題..XD
但是產生後序的部份應該是正常的。
印象中有四則運算、括號、次方運算^、負號

希望有人寫的更好可以取代它XD

以下是大略的參考資料

一般來說我們使用的計算式是中序,這會有優先權的問題,如a b * c實際上是將a存起來,計算b*c,再算出a 計算值
後序表示法解決了優先權的問題,使用後序只需要由左往右計算,而不需要考慮優先權
以一個中序表示法 a b來說,後序就是將其運算子放到最後面,變成a b
這就是一個最簡單的後序表示,它意謂著先將a, b儲存起來,讀到 需要運算,再將a與b的值取出來計算
那麼,一個a b * c的後序表示法應該會被看成"a (b * c) " => "a b c * "
要怎麼去知道後面的運算子優先權比較大?就是先去偷看下一個運算子,跟現在使用的運算子哪一個優先權比較大
這就算是拆解字串的部份了,當然,你可以再視情況加入括號以及你需要的ln計算,只要把ln當成是一個運算子即可

假設我們己經取得了a b c * 這個字串,請注意這裡,我是完全使用字串來存,所以我把所有的運算子運算元都用空白隔開
那麼開始計算這個算式,首先讀進a b c三個變數,因為我們沒有遇到任何的運算子,
讀到*號時,要讀入b, c兩個值,為什麼是b, c,看起來很像是我已經先知道的,實際上後序依賴堆疊(Stack)的方式來取得所需要的資料
Stack的原理是FILO,先放進去的,就最後取出,相對的,最後放進去的,就最先取出,
所以實際上取得的順序是c, b
再來計算好b * c的結果,再放到Stack中,原先的Stack剩下a跟這個計算出來的值,再讀到 號,於是重覆上面的步驟,
將計算值與a拿出來作 的計算,就可以得到原先我們希望的a b * c的結果

同理可證
a * b c => a b * c
a * b c / d => a b * c d /
(a * b c) / d => a b * c d /
a * (b c) / d => a b c * d /

「資料結構:使用C 」 (Fundamenta of Data Structure in C ) by Horowitz
------
不論是否我發的文,在能力範圍皆很樂意為大家回答問題。
為了補我的能力不足之處,以及讓答案可以被重複的使用,希望大家能儘量以公開的方式問問題。
在引述到我的文時自然會儘量替各位想辦法,謝謝大家!
系統時間:2024-07-07 16:20:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!