首页 > 其他分享 >力扣---剑指 Offer 09. 用两个栈实现队列

力扣---剑指 Offer 09. 用两个栈实现队列

时间:2023-03-17 21:44:38浏览次数:42  
标签:deleteHead 元素 appendTail Offer CQueue 09 --- deque2 deque1

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]

提示:
    1 <= values <= 10000
    最多会对 appendTail、deleteHead 进行 10000 次调用
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

思路1:将新加入的元素放在栈底:可以在有新元素加入时,将栈中的所有元素放入另一个栈,新元素加到栈底后,再将另一个栈中的元素转移到该栈中。

优化:由于将第一个栈的元素全部放到第二个栈后,第二个栈存储的元素本就已经是入栈的倒序,即栈顶元素即是最先加入的元素,利用这一点,可以先一直往第一个栈中添加元素。遇到删除元素的情况时,如果第二个栈非空,直接返回第二个栈的栈顶元素即可。如果第二个栈为空,则将第一个栈的全部元素的转移到第二个栈中,由于栈的特点,可以保证第二个栈的栈顶元素是最先添加到队列的元素。如果两个栈都是空,则直接返回-1即可。

优化前代码:

class CQueue {
    Deque<Integer> deque1;
    Deque<Integer> deque2;
    public CQueue() {
        this.deque1 = new LinkedList<>();
        this.deque2 = new LinkedList<>();
    }
    
    public void appendTail(int value) {
        // 将栈中的元素全部转移到另一个栈中。
        transfer(true);
        // 将新元素加到栈底
        deque1.push(value);
        // 将另一个栈中的元素重新转移到栈中。
        transfer(false);
    }
    
    public int deleteHead() {
        // 如果为null,返回-1
        if (deque1.isEmpty()) {
            return -1;
        }
        // 返回栈顶元素
        return deque1.pop();
    }
    private void transfer(boolean inOrOut) {
        if (inOrOut) {
            while (!deque1.isEmpty()) {
                deque2.push(deque1.pop());
            }
        } else {
            while (!deque2.isEmpty()) {
                deque1.push(deque2.pop());
            }
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

 

 优化1:

class CQueue {
    Deque<Integer> deque1;
    Deque<Integer> deque2;
    public CQueue() {
        this.deque1 = new LinkedList<>();
        this.deque2 = new LinkedList<>();
    }

    public void appendTail(int value) {
        // 将新元素加到栈顶
        deque1.push(value);
    }
    
    public int deleteHead() {
        if (deque2.isEmpty()) {
            if (deque1.isEmpty()) {
                return -1;
            } else {
                while (!deque1.isEmpty()) {
                    deque2.push(deque1.pop());
                }
                return deque2.pop();
            }
        } else {
            return deque2.pop();
        }
    }
}

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */

标签:deleteHead,元素,appendTail,Offer,CQueue,09,---,deque2,deque1
From: https://www.cnblogs.com/allWu/p/17228270.html

相关文章

  • css-transform2D变换
    @目录translate()位移rotate()旋转scale()缩放skew()斜切transform的细节和特性元素引用transform属性值不会影响元素的尺寸和位置参数的顺序不同,会影响结果transform......
  • 选择清除分析软件XP-CLR的安装折腾之路
    目录1.原版2.Python版本安装运行原因分析后续分析推荐1.原版安装比较简单。wgethttps://reich.hms.harvard.edu/sites/reich.hms.harvard.edu/files/inline-files/X......
  • ng-alain: i18n
    https://github.com/ng-alain/delon/blob/master/packages/theme/src/services/i18n/i18n.tsinterfaceAlainI18NServiceabstractclassAlainI18nBaseServiceimplemen......
  • 人工智能-Pytorch案例实战(2)-CNN 的stride和zero-padding
    CNN的stridestride:是filter滑动图像的步长例如:stride=1,对于一个7*7的灰白图片,通过一个3*3大小的filter,输出下一个图片的大小为5*5(如何计算呢?公式呢?)(W-F+2P/......
  • 人工智能-Pytorch案例实战(1)-CNN Convolution Layer
    ConvolutionLayer左侧图示:一张彩色的图片,有三个部分组成(长度width宽度high深度depth),例如:32*32*3表示一彩色图片长度和宽度分别是32,32右侧图示:在CNN中,filter是一个......
  • Mybatis-Plus查询投影详解
    查询投影的作用是在查询数据库时只返回所需的字段,而不是返回全部的字段。这样可以实现以下几个方面的作用:减少网络传输数据量:只返回需要的字段,可以减少从数据库服务器到......
  • PDFSharp - Graphics
    PDFSharp-GraphicsGraphics-PDFsharpandMigraDocWiki所有的Graphics类型都设计成模仿来自System.Drawing命名空间中的GDI+类型。类型的名称也类似,例如:XColo......
  • 输入一个字符串(例如:3+6-3*4/2,运算符只有 + - * / 四个),计算结果。不考虑加减乘除优先级
    这是自己面试遇到的面试题,考Java基础,String。考的很基础,但是String确实java中很重要的基础部分。题目:输入一个字符串(例如:3+6-3*4/2,输出12。运算符只有+-*/四个),计算......
  • Vue.js 非单文件组件-一个重要的内置关系
    视频58视频59<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>一个重要的内置关系</title> <!--引入Vue--> <scripttype="text/javascript......
  • pytest + yaml 框架 -21.int类型和数字类型的str相互转换
    前言在yaml文件中定义变量的时候,如果是纯数字的值,默认是数字类型,加上引号可以变成字符串类型。对于取值结果,我们还可以使用python内置的函数去转换环境要求Python......