Skip to content

Instantly share code, notes, and snippets.

@skalahonza
Created June 6, 2018 16:37
Show Gist options
  • Save skalahonza/0998aef46cd8a688a966acc5b8432c9f to your computer and use it in GitHub Desktop.
Save skalahonza/0998aef46cd8a688a966acc5b8432c9f to your computer and use it in GitHub Desktop.
Queue implementation in haskell using 2 stacks.
module QueueStacks where
type Stack v = [v]
push :: v -> Stack v -> Stack v
push value stack = value:stack
pop :: Stack v -> Stack v
pop [] = []
pop (_:newStack) = newStack
data Queue v = InStackOutStack (Stack v) (Stack v) deriving (Eq, Show)
enqueue :: v -> Queue v -> Queue v
enqueue tmp (InStackOutStack ins out) = (InStackOutStack (push tmp ins) out)
dequeue :: Queue v -> Queue v
dequeue q = dequeueDisp (dispatch q)
dequeueDisp (InStackOutStack ins out) = (InStackOutStack ins (pop out))
dispatch :: Queue v -> Queue v
dispatch (InStackOutStack [] []) = (InStackOutStack [] [])
dispatch (InStackOutStack ins []) = (InStackOutStack [] (reverse ins))
dispatch (InStackOutStack ins out) = (InStackOutStack ins out)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment