LeetCode0232.用栈实现队列 Go语言AC笔记

时间复杂度: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一个元素就来回倒一次,看了题解后才反应过来其实只保证一个栈入一个栈出,在出栈时再判断是否需要倒栈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwithunH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值