Implement Queue using Stacks

Problem Description

Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).

Implement the MyQueue class:

Notes:

 

Example 1:

Input
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
Output
[null, null, null, 1, 1, false]

Explanation
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false

 

Constraints:

 

Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.

Solution (Go)

type MyQueue struct {
	primary *list.List
	backup  *list.List
}

func Constructor() MyQueue {
	return MyQueue{
		primary: list.New(),
		backup:  list.New(),
	}
}

func (this *MyQueue) Push(x int) {
	for this.backup.Len() > 0 {
		this.primary.PushBack(this.backup.Remove(this.backup.Back()))
	}
	this.primary.PushBack(x)
}

func (this *MyQueue) Pop() int {
	for this.primary.Len() > 0 {
		this.backup.PushBack(this.primary.Remove(this.primary.Back()))
	}
	return this.backup.Remove(this.backup.Back()).(int)
}

func (this *MyQueue) Peek() int {
	for this.primary.Len() > 0 {
		this.backup.PushBack(this.primary.Remove(this.primary.Back()))
	}
	return this.backup.Back().Value.(int)
}

func (this *MyQueue) Empty() bool {
	return this.primary.Len() == 0 && this.backup.Len() == 0
}


/**
 * Your MyQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Push(x);
 * param_2 := obj.Pop();
 * param_3 := obj.Peek();
 * param_4 := obj.Empty();
 */