java算法第十天 | ● 栈和队列理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

栈和队列理论基础

  • 栈 :先进后出
  • 队列 :先进先出

Java中队列Queue的操作

  1. 队列
    使用Queue接口创建队列 ,Queue的实现类有LinkedListArrayDeque。最常用的实现类是LinkedList
    Queue的六种方法:
  • add()和 offer()
    向队列中添加元素,将元素压入队尾。当超出容量时add()会抛出异常 , offer()会返回false。
  • remove() 和 poll()
    移除元素,将元素从队头移出。当当前容量为0执行移除操作时,remove()会抛出异常 , poll()会返回false。
  • element() 和 peek()
    获取队头元素,当前容量为0时。element()会抛出异常 , peek()会返回null。

  1. 使用Stack类创建栈,Stack是Java中本身具有的集合类型,所包含的方法包括:
  • boolean isEmpty() // 判断当前栈是否为空
  • synchronized E peek() //获得当前栈顶元素
  • synchronized E pop() //获得当前栈顶元素并删除
  • push(E object) //将元素加入栈顶
  • synchronized int search(Object o) //查找元素在栈中的位置,由栈低向栈顶方向数

232.用栈实现队列

leetcode链接
思路: 用两个栈实现队列。
Alt
注意: 可以看出peek()的实现,直接复用了pop(), 要不然,对stOut判空的逻辑又要重写一遍。
再多说一些代码开发上的习惯问题,在工业级别代码开发中,最忌讳的就是 实现一个类似的函数,直接把代码粘过来改一改就完事了。
这样的项目代码会越来越乱,一定要懂得复用,功能相近的函数要抽象出来,不要大量的复制粘贴,很容易出问题!(踩过坑的人自然懂)

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn=new Stack<>();
        stackOut=new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        dumpstackIn();
        return stackOut.pop();
    }
    
    public int peek() {
        dumpstackIn();
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackIn.isEmpty() && stackOut.isEmpty();

    }

    // 如果stackOut为空,那么将stackIn中的元素全部放到stackOut中
    private void dumpstackIn(){
        if(!stackOut.isEmpty()){
            return;
        }else{
            while(!stackIn.isEmpty()){
                stackOut.push(stackIn.pop());
            }
        }   
    }


}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */

时间复杂度: pop为O(n),其他为O(1)
空间复杂度: O(n)

225. 用队列实现栈

leetcode链接
思路: 用一个queue就可以实现栈

  • 每次添加元素直接再队列末尾追加
  • 删除元素时需要依次把除末尾元素之外的元素删除并重新移到队列末尾,使要删除的元素位于队列的队首。
  • 获取最顶端元素时,如果是LinkedList实现的队列,需要执行依次移位后获取当前队首元素(即原队列的队尾元素)后,删除当前队首元素,并重新添加到队尾。如果是ArrayDeque实现的话,则可以直接使用que1.peekLast()获取队尾元素。

方法一 LinkedList实现

追加元素 queue.add(x)/.offer(x);
弹出元素 queue.poll(x)/remove(x);
获取队首元素 queue.peek()/element();

class MyStack {
    Queue<Integer> queue;

    public MyStack() {
        queue=new LinkedList<>();
    }
    
    public void push(int x) {
        queue.add(x);
    }
    
    public int pop() {
        rePosition();
        return queue.poll();
    }
    
    public int top() {
        rePosition();
        int result=queue.poll();
        queue.add(result);
        return result;
    }
    
    public boolean empty() {
        return queue.isEmpty();

    }
    public void rePosition(){
        int size=queue.size();
        for(int i=0;i<(size-1);i++){
            queue.add(queue.poll());
        }
    }
}

/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

**方法二 ArrayDeque实现

队尾追加元素 queue.addLast(x);
队首弹出元素 queue.pollFirst();
获取队首元素 queue.peekFirst();
获取队尾元素 queue.peekLast();

class MyStack {
    // Deque 接口继承了 Queue 接口
    // 所以 Queue 中的 add、poll、peek等效于 Deque 中的 addLast、pollFirst、peekFirst
    Deque<Integer> que1;
    /** Initialize your data structure here. */
    public MyStack() {
        que1 = new ArrayDeque<>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        que1.addLast(x);
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        int size = que1.size();
        size--;
        // 将 que1 导入 que2 ,但留下最后一个值
        while (size-- > 0) {
            que1.addLast(que1.peekFirst());
            que1.pollFirst();
        }

        int res = que1.pollFirst();
        return res;
    }
    
    /** Get the top element. */
    public int top() {
        return que1.peekLast();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return que1.isEmpty();
    }
}

时间复杂度: pop为O(n),其他为O(1)
空间复杂度: O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431973.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot+MYSQL的网页时装购物系统

目录 1、 前言介绍 2、主要技术 3、系统流程分析 3.1、系统登录流程图 3.2、添加信息流程图 3.3、删除信息流程图 4、系统体系结构 4.1、时装购物系统的结构图 4.2、登录系统结构图 4.3、时装购物系统结构图 5、数据库设计原则 5.1、管理员信息属性图 5.2、用户管…

CSS文本样式值,web前端开发资料

正文 什么是行内元素&#xff1f; display属性为inline的元素为行内元素&#xff0c;英文&#xff1a;inline element&#xff0c;其中文叫法有多种&#xff0c;如&#xff1a;内联元素、内嵌元素、行内元素、直进式元素等。 特点&#xff1a; 和其他元素都在一行上&#x…

汉字中文验证码点选识别匹配,达到商用级别

汉字中文验证码点选识别匹配深度学习方法实现&#xff0c;达到商用级别 一、简介1.1 需求分析1.2 运行效果1.3 性能指标 二、使用方法2.1 源码运行2.2 打包后运行2.3 测试效果 三、项目下载 一、简介 1.1 需求分析 针对中文验证码进行识别&#xff0c;当出现以下验证码时&…

MySQL性能优化-Mysql索引篇(4)

概览 承接上文&#xff0c;我们说过数据库读取磁盘的最小单位是页不是行&#xff0c;那么对于数据库来说&#xff0c;如果我们想要查找多行记录&#xff0c;查询时间是否会成倍地提升呢&#xff1f;其实数据库会采用缓冲池的方式提升页的查找效率。 为了更好地理解SQL查询效率…

计算机设计大赛 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

【探索AI】程序员如何选择职业赛道?

程序员如何选择职业赛道&#xff1f; 程序员的职业赛道就像是一座迷宫&#xff0c;有前端的美丽花园&#xff0c;后端的黑暗洞穴&#xff0c;还有数据科学的神秘密室。你准备好探索这个充满挑战和机遇的迷宫了吗&#xff1f;快来了解如何选择职业赛道吧&#xff01; 自我评估…

Git分布式管理-头歌实验日志和版本回退

在Git使用过程中&#xff0c;一种很常见的情况是&#xff1a;发现某个已经提交到仓库里的代码文件有致命的bug&#xff0c;必须将代码回滚到上一个版本&#xff0c;在这种情况下就显示出了Git的强大。Git为每次提交&#xff0c;都保留了日志&#xff0c;根据提交日志&#xff0…

人工智能-飞桨

文章目录 概要安装零基础教程基础知识小结 概要 集核心框架、基础模型库、端到端开发套件、丰富的工具组件于一体的深度学习平台 官方入口 安装 python安装 python官方下载 PaddlePaddle安装 python -m pip install paddlepaddle2.6.0 -i https://mirror.baidu.com/pypi/s…

电脑电源电压不足会出现什么问题?怎么办?

电脑电源的电压是多少&#xff1f; 电脑电源输出一般有12V、5V、3.3V三种不同的电压。 电脑电源负责给电脑配件供电&#xff0c;如CPU、主板、内存条、硬盘、显卡等&#xff0c;是电脑的重要组成部分。 新规格的12V、5V、3.3V等输出的电源分配一般更适合当前电脑配件的电源需求…

【中国电信】光猫 PT632 使用超管权限修改 IP 地址租期时间

背景 由于光猫默认设置的动态 IP 租期是 24 小时&#xff0c;所以每天都会断网一次&#xff0c;严重影响用网体验&#xff0c;所以打算通过修改动态 IP 租期为 一周&#xff08;最长就一周&#xff0c;没有永久的选项&#xff09;来改善。 需求 一台电脑&#xff08;已开启 …

网络信息安全:OpenSSH_7.4p1升级至OpenSSH_9.6p1 | ssh-agent远程代码执行漏洞(CVE-2023-38408)

网络&信息安全&#xff1a;OpenSSH_7.4p1升级至OpenSSH_9.6p1 | ssh-agent远程代码执行漏洞(CVE-2023-38408&#xff09; 1.1 风险详情1.2 操作环境1.3 漏洞处理&#xff1a;OpenSSH升级1、查看SSH客户端的版本信息2、列出系统中openssl、openssh的软件包3、启动telnet&…

idea:springboot项目搭建

目录 一、创建项目 1、File → New → Project 2、Spring Initializr → Next 3、填写信息 → Next 4、web → Spring Web → Next 5、填写信息 → Finish 6、处理配置不合理内容 7、注意事项 7.1 有依赖包&#xff0c;却显示找不到依赖&#xff0c;刷新一下maven 二…

SmartX 携手 openGauss 社区发布联合方案评测与性能最佳实践 | 附优化方法与测试数据

近日&#xff0c;北京志凌海纳科技有限公司&#xff08;以下简称 “SmartX”&#xff09;携手 openGauss 社区完成了 openGauss 数据库基于 SmartX 超融合平台&#xff08;SMTX OS&#xff09;和 SmartX 分布式存储平台&#xff08;SMTX ZBS&#xff09;的性能测试和调优。 结…

JVM(垃圾回收机制 ---- GC)

啥是垃圾? 不再使用的内存 啥是垃圾回收机制? 自动释放不用的内存 注意: GC 主要是针对 堆 进行的 GC的基本操作单位是 对象, 即GC’回收的是整个对象都不使用的情况 GC 的优缺点 好处: 省心, 写代码简单, 不易出错 缺点: 需要消耗额外资源, 有额外性能开销 , 此外, 易触发 S…

vue 内容渲染和属性绑定

内容渲染指令 1. 使用v-text指令&#xff0c;将数据采用纯文本方式填充其空元素中 <script setup>import { reactive } from vuelet student reactive({name: Jack,desc: <h3>我是来自中国的小朋友&#xff01;</h3>}) </script> <template><…

介绍下RabbitMQ的事务机制

想要保证发送者一定能把消息发送给RabbitMQ&#xff0c;一种是通过confirm机制&#xff0c;另外一种就是通过事务机制。 RabbitMQ的事务机制&#xff0c;允许生产者将一组操作打包一个原子事务单元&#xff0c;那么全部执行成功&#xff0c;要么全部失败。事务提供了一种确保消…

【开源】JAVA+Vue.js实现食品生产管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 加工厂管理模块2.2 客户管理模块2.3 食品管理模块2.4 生产销售订单管理模块2.5 系统管理模块2.6 其他管理模块 三、系统展示四、核心代码4.1 查询食品4.2 查询加工厂4.3 新增生产订单4.4 新增销售订单4.5 查询客户 五、…

操作系统:初识操作系统

目录 1.冯诺依曼体系结构 2.操作系统 2.1什么是操作系统 2.2为什么需要操作系统 2.3怎么实现操作系统 1.冯诺依曼体系结构 对于上图&#xff1a; 输入设备完成的是写入工作&#xff0c;输出设备完成输出工作&#xff0c;这两部分包含磁盘这类的外存。 存储器一般指的是内存…

【C#杂谈】在 .NET Framework 中使用新的C#语言特性

前排提示&#xff1a;提出一个可以让 [^1] 这中语法可以在.NET Framework运行时中使用的方法 众所都周知&#xff0c;.NET Framework&#xff08;以下简称 .NF&#xff09;作为一个被微软官方确认不在继续发布新特性的运行时&#xff0c;它所对应的C#语言版本被&#xff08;官方…

TruEra

文章目录 关于 TruEra关于 TruLens 关于 TruEra TruEra Gen AI Observability and LLM Evaluation​ Monitor, evaluate, and debug your LLM and Gen AI apps. All part of Full Lifecycle AI Observability from TruEra. 官网&#xff1a;https://truera.comgithub : https…