写点什么

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

作者:陈明勇
  • 2022-11-15
    广东
  • 本文字数:1042 字

    阅读完需:约 3 分钟

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

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

题目来源

来源:力扣(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(); */
复制代码

执行结果


复杂度分析

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


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

总结

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

发布于: 刚刚阅读数: 4
用户头像

陈明勇

关注

还未添加个人签名 2021-10-20 加入

还未添加个人简介

评论

发布
暂无评论
[力扣] 剑指 Offer 第一天 - 用两个栈实现队列_Go_陈明勇_InfoQ写作社区