时间复杂度:O(1)
解题思路
两个栈,一个作为入栈stkIn,一个作为出栈stkOut。入栈的功能是接收push的元素,出栈的功能是实现pop和peek操作。
入队时,直接将元素入栈到stkIn中。
出队时,先判断一下stkOut是否为空,如果为空就需要将stkIn中的元素全部“倒入”stkOut,注意领会“倒入”这个词。(“倒入”可以很好地帮助理解stkIn元素全部入栈到stkOut的过程,把栈理解为一个木桶,桶底就是栈底,桶顶就是栈顶,当我们把物品放入桶中其实就是一个入栈的操作,当我们取桶中物品时也只能取桶顶的那个东西,所以“倒入”操作就是把一个桶中的物品倒入另一个空桶中,在旧桶顶的物品自然成为了新桶桶底的物品。)“倒入”stkOut后,就可以取stkOut栈顶元素,这就是我们需要的队头元素。
AC代码
type MyQueue struct {
in,out []int
}
func Constructor() MyQueue {
return MyQueue{}
}
func (this *MyQueue)in2out(){
for len(this.in)>0{
this.out=append(this.out,this.in[len(this.in)-1])
this.in=this.in[:len(this.in)-1]
}
}
func (this *MyQueue) Push(x int) {
this.in=append(this.in,x)
}
func (this *MyQueue) Pop() int {
if len(this.out)==0{
this.in2out()
}
head:=this.out[len(this.out)-1]
this.out=this.out[:len(this.out)-1]
return head
}
func (this *MyQueue) Peek() int {
if len(this.out)==0{
this.in2out()
}
return this.out[len(this.out)-1]
}
func (this *MyQueue) Empty() bool {
return len(this.in)==0&&len(this.out)==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();
*/
感悟
一开始只想到了两个栈来回倒,push一个元素就来回倒一次,看了题解后才反应过来其实只保证一个栈入一个栈出,在出栈时再判断是否需要倒栈。