代码编织梦想

题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,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 次调用

Related Topics

  • 设计
  • 队列

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

用两个栈,一个记录输入、一个记录输出

翻了下评论区,看到个很有趣的评论:

可以使用LinkedList来做Stack的容器,因为LinkedList实现了Deque接口,所以Stack能做的事LinkedList都能做,其本身结构是个双向链表,扩容消耗少。

AbstractList <- AbstractSequentialList <- LinkedList,AbstractList <- Vector <- Stack

stack和linkedlist不是都从AbstractList继承来的

  • LinkedList直接继承于AbstractSequentialList,也就是直接继承于顺序表抽象类,这个有序表抽象类继承于列表抽象类(AbstractList)。 AbstractList提供了基本的列表操作,其的doc中写道:For sequential access data (such as a linked list),AbstractSequentialList should be used in preference to this class. 也就是对于顺序表,需要优先继承于顺序表抽象类而非直接使用列表抽象类。 这个是在架构或者说是在思想层面上的解释,也解释了我为什么我这么说。

  • 就jdk源码层面来说 LinkedList本身维护了Node类型的 first和last 头尾节点以实现双向链表的存储结构。

  • Vector 维护了一个 Object[]数组,并实现了对数组的各种操作,Stack只是根据栈的特性,提供了push`pop\peek\emty等方法,并调用父类(Vector)的方法来操作数组。 所以在这个层面上来说,确实将我的说法中"而Vector底层是AbstractList,是一个数组"改为"而Vector底层是Object`[],是一个数组"更加稳妥。

    大佬的力扣个人空间:summer1121 - 力扣(LeetCode)

    评论区:剑指 Offer 09. 用两个栈实现队列 - 力扣(LeetCode)

题解

class CQueue {

    Deque<Integer> inputStack;
    Deque<Integer> outputStack;

    public CQueue() {
        inputStack = new ArrayDeque<>();
        outputStack = new ArrayDeque<>();
    }
    
    public void appendTail(int value) {
        inputStack.push(value);
    }
    
    public int deleteHead() {
        if (outputStack.isEmpty()){
            if (inputStack.isEmpty()){
                return -1;
            }else {
                while (!inputStack.isEmpty()){
                    outputStack.push(inputStack.pop());
                }
            }
        }
        return outputStack.pop();
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52476654/article/details/126358025

剑指 Offer 09. 用两个栈实现队列-Python题解-爱代码爱编程

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

【leetcode C语言实现】剑指 Offer 09.用两个栈实现队列-爱代码爱编程

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

剑指 Offer 09. 用两个栈实现队列-爱代码爱编程

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

剑指 Offer 09. 用两个栈实现队列JavaScript实现-爱代码爱编程

剑指 Offer 09. 用两个栈实现队列JavaScript实现 问题描述代码注意事项 问题描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入:

剑指 Offer 09. 用两个栈实现队列(JS)-爱代码爱编程

剑指 Offer 09. 用两个栈实现队列(JS) var CQueue = function() { //初始化 this.stack1 = []; this.stack2 = []; }; /** * @param {number} value * @return {void} */ CQueue.prototype.

剑指offer 09. 用两个栈实现队列-爱代码爱编程

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

剑指 Offer 09. 用两个栈实现队列-js-爱代码爱编程

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

【剑指offer】剑指 Offer 09. 用两个栈实现队列(C++ 模拟 栈 队列)-爱代码爱编程

题目链接 题意: 用两个栈模拟队列,要求实现插入和删除操作。 思路: 栈的特点:先进后出 队列的特点:先进先出所以用一个栈 s t k

剑指 Offer 09. 用两个栈实现队列 Java-爱代码爱编程

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

剑指 Offer 09. 用两个栈实现队列 (python 实现)-爱代码爱编程

剑指 Offer 09. 用两个栈实现队列 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHea

python:剑指 Offer 09. 用两个栈实现队列-爱代码爱编程

python:剑指 Offer 09. 用两个栈实现队列 草稿 class CQueue: def __init__(self): self.stk_in = [] self.stk_out = [] def appendTail(self, value: int) -> None:

剑指 Offer 09. 用两个栈实现队列(C++版)-爱代码爱编程

剑指 Offer 09. 用两个栈实现队列(C++版) 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入:["CQueue","appendTail","dele

剑指 Offer 09. 用两个栈实现队列 | C++-爱代码爱编程

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

剑指 offer 09. 用两个栈实现队列(java)_春风又。的博客-爱代码爱编程

目录 题目思路代码 题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHe

leetcode-145. binary tree postorder traversal [c++][java]_贫道绝缘子的博客-爱代码爱编程

LeetCode-145. Binary Tree Postorder TraversalLevel up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next int

【leetcode】641. 设计循环双端队列_pass night的博客-爱代码爱编程

题目 641. 设计循环双端队列 设计实现双端队列。 实现 MyCircularDeque 类: MyCircularDeque(int k) :构造函数,双端队列最大为 k 。boolean insertFront

leetcode题解—260.只出现一次的数字Ⅲ_就要 宅在家的博客-爱代码爱编程

题目地址:260. 只出现一次的数字 III - 力扣(LeetCode)   题解: 这道题是基于寻找只出现一次的数字Ⅰ上的拓展。136. 只出现一次的数字 - 力扣(LeetCode)  在Ⅰ中,我们只需要把所有的数字异或一遍即可,因为只有一个数字是唯一的。 但是,这道升级题中有两个单独的数字,只是异或遍历一遍的话就相当于让这两个数字异或。

牛客每日刷题之二叉树__18shou的博客-爱代码爱编程

  ✅作者简介:我是18shou,一名即将秋招的java实习生 ✨个人主页:_18shou 🔥系列专栏:牛客刷题专栏 📃推荐一款模拟面试、刷题神器👉 在线刷题面经模拟面试 目录 题目 思路 题解 复杂度 📃结语 题目 操作给定的二叉树,将其变换为源二叉树的镜像。 数据范围:二叉树的节点数0≤n≤1000,二叉树每个节点的值

数组原地哈西一类题一网打尽_一个山里的少年的博客-爱代码爱编程

目录  一.数组中重复的数据  二.找到数组中所有消失的数字  三.缺少的第一个正数  四.寻找重复数 一.数组中重复的数据 1.letecode链接: 442. 数组中重复的数据 - 力扣(LeetCode) 2.题目描述: 3.解题思路: 1.由于题目说了所有的整数的范