44 lines
637 B
Go
44 lines
637 B
Go
package containers
|
|
|
|
func NewQueue[T interface{}]() Queue[T] {
|
|
return Queue[T]{
|
|
front: NewStack[T](),
|
|
back: NewStack[T](),
|
|
}
|
|
}
|
|
|
|
type Queue[T interface{}] struct {
|
|
front, back *Stack[T]
|
|
}
|
|
|
|
func (m *Queue[T]) Push(val T) {
|
|
m.front.Push(val)
|
|
}
|
|
|
|
func (m *Queue[T]) swapStacks() {
|
|
if m.back.Empty() {
|
|
for !m.front.Empty() {
|
|
val, _ := m.front.Pop()
|
|
m.back.Push(val)
|
|
}
|
|
}
|
|
}
|
|
|
|
func (m *Queue[T]) Pop() T {
|
|
m.swapStacks()
|
|
|
|
val, _ := m.back.Pop()
|
|
return val
|
|
}
|
|
|
|
func (m *Queue[T]) Peek() T {
|
|
m.swapStacks()
|
|
|
|
val, _ := m.back.Peek()
|
|
return val
|
|
}
|
|
|
|
func (m *Queue[T]) Empty() bool {
|
|
return m.front.Empty() && m.back.Empty()
|
|
}
|