[力扣] 剑指 Offer 第一天 - 用两个栈实现队列

该博客介绍了如何利用两个栈来模拟一个队列,详细阐述了`appendTail`和`deleteHead`方法的实现过程。在`appendTail`中,元素直接入栈;在`deleteHead`中,如果输出栈为空,则将输入栈所有元素移到输出栈,然后出队。时间复杂度分析表明,`appendTail`操作为常数时间,而`deleteHead`最坏情况为线性时间。博客内容适合对数据结构和算法感兴趣的读者。

耐心和持久胜过激烈和狂热。

题目来源

来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

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

示例 1

输入:

["CQueue","appendTail","deleteHead","deleteHead","deleteHead"]

[[],[3],[],[],[]]

输出:

[null,null,3,-1,-1]

示例 2

输入:

["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]

输出:

[null,-1,null,null,5,2]

题目分析

题目中提到栈和队列,栈的特点是后进先出,队列的特点是先进先出。根据题意,可以定义两个栈,分别为输入栈输出栈输入栈负责保存 appendTail 所传入的值,输出栈负责输出 deleteHead 所返回的值

解题思路

  • 对于入队 appendTail 方法,只需将元素压入输入栈即可

  • 对于出队 deleteHead 方法

    • 根据题意,首先判断输入栈输出栈是否都为空,条件成立则返回 -1
    • 如果上面的条件不成立,判断输出栈是否为空,不为空则直接出队;否则先将输入栈里的元素压入输出栈,再出队

代码实现

type CQueue struct {
	inStack, outStack []int
}

func Constructor() CQueue {
	return CQueue{}
}

func (cq *CQueue) AppendTail(value int) {
	cq.inStack = append(cq.inStack, value)
}

func (cq *CQueue) DeleteHead() int {
	if len(cq.outStack) == 0 && len(cq.inStack) == 0 {
		return -1
	}
	if len(cq.outStack) == 0 {
		for len(cq.inStack) != 0 {
			cq.outStack = append(cq.outStack, cq.inStack[len(cq.inStack)-1])
			cq.inStack = cq.inStack[:len(cq.inStack)-1]
		}
	}
	val := cq.outStack[len(cq.outStack)-1]
	cq.outStack = cq.outStack[:len(cq.outStack)-1]
	return val
}

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

执行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pdZ0LxlG-1668526773357)(https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/31de0d14af3f4bb8b133f92fb50ad822~tplv-k3u1fbpfcp-watermark.image?)]

复杂度分析

时间复杂度:appendTail 为 O(1),deleteHead 最坏的情况下为 O(N),输出栈需要遍历输入栈获取元素

空间复杂度:O(N),最坏情况下输入栈输出栈一共存储 N 个元素

总结

以上是本人的解法,如果对你有帮助,欢迎点赞收藏加关注,如果有错误的地方,欢迎指正!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员陈_明勇

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

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

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

打赏作者

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

抵扣说明:

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

余额充值