1. 列表表示
module Queue(Queue,emptyQueue,queueEmpty,enqueue,dequeue,front) where
newtype Queue a = Q [a]
deriving Show
emptyQueue :: Queue a
emptyQueue = Q []
queueEmpty :: Queue a -> Bool
queueEmpty (Q []) = True
queueEmpty (Q _) = False
enqueue :: a -> Queue a -> Queue a
enqueue x (Q q) = Q (q ++ [x])
dequeue :: Queue a -> Queue a
dequeue (Q (_:xs)) = Q xs
dequeue (Q []) = error "dequeue: empty queue"
front :: Queue a -> a
front (Q (x:_)) = x
front (Q []) = error "front: empty queue"
2. 使用兩個(gè)列表
module Queue(Queue,emptyQueue,queueEmpty,enqueue,dequeue,front) where
newtype Queue a = Q ([a], [a])
emptyQueue :: Queue a
emptyQueue = Q ([], [])
queueEmpty :: Queue a -> Bool
queueEmpty (Q ([], [])) = True
queueEmpty _ = False
enqueue :: a -> Queue a -> Queue a
enqueue x (Q ([], [])) = Q ([x], [])
enqueue y (Q (xs, ys)) = Q (xs, y:ys)
dequeue :: Queue a -> Queue a
dequeue (Q ([], [])) = error "dequeue: empty queue"
dequeue (Q ([], ys)) = Q (tail $ reverse ys, [])
dequeue (Q (x:xs, ys)) = Q (xs, ys)
front :: Queue a -> a
front (Q ([], [])) = error "front: empty queue"
front (Q ([], ys)) = last ys
front (Q (x:xs, ys)) = x
instance (Show a) => Show (Queue a) where
showsPrec p (Q (front, rear)) str =
showString "Q " (showList (front ++ reverse rear) str)
參考
Algorithms: A Functional Programming Approach
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。