剑指 Offer 09. 用两个栈实现队列(相邻相同操作只需要移动一次)

这篇博客讨论了一种使用两个栈来实现队列的方法,以优化插入和删除操作。通过一个主栈用于插入,一个辅助栈用于删除,确保了在相邻操作相同的情况下只需搬动一次数据。在删除时,如果主栈为空,则从辅助栈中删除;如果主栈不为空,则将主栈数据转移到辅助栈并删除。这种设计提高了操作效率,减少了数据移动的次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

示例 1:
输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

思路

建立两个栈,一个主栈,一个辅助栈,主栈用于插入,辅助栈用于删除
插入时,如果辅助栈为空,说明上一次操作为插入,直接在主栈中插入即可,反之需要将辅组栈中数据从尾到头依次搬到主栈中
删除时,如果主栈为空,说明上一次操作为删除,直接在辅助栈中删除,反之搬数据

优点

相邻操作相同,只需要搬动一次数据即可

代码
type CQueue struct {
    stack []int
    subStack []int
}


func Constructor() CQueue {
    return CQueue{
        stack : make([]int, 0),
        subStack : make([]int, 0),
    }
}


func (this *CQueue) AppendTail(value int)  {
    
    // 插入时,如果辅助栈为空,直接在主栈进行插入
    if  len(this.subStack) == 0 {
        this.stack = append(this.stack, value)
        return
    }

    // 将辅助栈中数据从尾到头搬到主栈中,进行插入
    endIndex := len(this.subStack) -1
    for ; endIndex >= 0; endIndex--{
        this.stack = append(this.stack, this.subStack[endIndex])
    }
    this.stack = append(this.stack, value)
    // 清空辅助栈
    this.subStack = this.subStack[:0]
    
}


func (this *CQueue) DeleteHead() int {
    
    // 主栈与辅助栈都为空,队列中没有数据,返回-1
    if len(this.stack) == 0 && len(this.subStack) == 0{
       return -1
    }

    value := int(0)

    // 主栈为空,直接在辅助栈中进行删除
    if len(this.stack) == 0 {
        endIndex := len(this.subStack)-1
        value = this.subStack[endIndex]
        this.subStack = this.subStack[:endIndex]
        return value
    }

    // 主栈有数据,从尾到头将数据搬到辅助栈后,进行删除
    endIndex := len(this.stack) -1
    for ; endIndex > 0; endIndex--{
        this.subStack = append(this.subStack, this.stack[endIndex])
    }
    value = this.stack[0]
    this.stack = this.stack[:0]

    return value


}


/**
 * Your CQueue object will be instantiated and called as such:
 * obj := Constructor();
 * obj.AppendTail(value);
 * param_2 := obj.DeleteHead();
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值