type MyQueue struct {
	Stack MyStack
	Queue MyStack
}


/** Initialize your data structure here. */
func Constructor() MyQueue {
	return MyQueue{make([]int, 0), make([]int, 0)}
}


/** Push element x to the back of queue. */
func (this *MyQueue) Push(x int)  {
	for !this.Queue.Empty() {
		this.Stack.Push(this.Queue.Pop())
	}
	this.Stack.Push(x)
}


/** Removes the element from in front of queue and returns that element. */
func (this *MyQueue) Pop() int {
	for !this.Stack.Empty() {
		this.Queue.Push(this.Stack.Pop())
	}
	return this.Queue.Pop()
}


/** Get the front element. */
func (this *MyQueue) Peek() int {
	for !this.Stack.Empty() {
		this.Queue.Push(this.Stack.Pop())
	}
	return this.Queue.Peek()
}


/** Returns whether the queue is empty. */
func (this *MyQueue) Empty() bool {
	return this.Stack.Empty() && this.Queue.Empty()
}


/**
 * 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();
 */


type MyStack []int


func (s MyStack) Size() int {
	return len(s)
}


func (s MyStack) Empty() bool {
	return len(s) == 0
}


func (s MyStack) Peek() int {
	return s[len(s)-1]
}


func (s *MyStack) Push(x int) {
	*s = append(*s, x)
}


func (s *MyStack) Pop() int {
	n := len(*s)
	top := (*s)[n-1]
	*s = (*s)[:n-1]
	return top
}