• 剑指Offer 09.用两个栈实现队列


    题目

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

    示例 1:

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

    示例 2:

    输入:
    ["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
    [[],[],[5],[2],[],[]]
    输出:[null,-1,null,null,5,2]
    
    • 1
    • 2
    • 3
    • 4

    提示:

    • 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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    由两个独立的高增益运算放大器组成的运放芯片D258,可应用于音频信号处理系统上
    线程池执行流程
    STL关联式容器set,multiset,pair,map
    2022年深圳杯建模A题思路: 破除“尖叫效应”与“回声室效应”,走出“信息茧房”
    因合约代码Bug,约2.2亿元11539枚以太币被永久锁定
    HTML 脚本
    写一个函数del,用来删除动态链表中指定的节点
    TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的实践技术应用
    Laravel 高级版:鲜为人知但实用的 Composer 命令
    el-cascader回显只选中不显示的问题
  • 原文地址:https://blog.csdn.net/qq_52476654/article/details/126358025