java栈与队列

2023-10-26

3、栈

栈是一种特殊的线性表

栈只能在一端(栈顶)进行操作,往栈里添加元素叫入栈,删除栈里的元素叫出栈,后进的元素先出

官方栈:java.util.Stack

栈的应用:浏览器的前进与后退

如果输入三个网址(假设123三个)

出栈过程(后退操作):假设现在正在看3,想要返回2,需要将3移出栈,同理再想看1,将2移出栈,这两个元素组成的新栈从栈顶到栈底依次为:2、3

入栈过程(前进操作):后退到1后,想要回到2页面,就得把2移回来,重新变成栈顶

上述操作体现“先进后出”思想

4、队列

队列也是一种特殊的线性表

队列可以两端操作,但两端操作分别受限,队尾只能添加元素(入队),队头只能删除元素(出队)

类比排队买票,如果要买票就得从队尾排,买完票就从队头出来,中间叫插队,是不允许的

因为队列在头尾进行操作,所以最好用“双向链表” 

官方队列:Queue 

利用栈实现队列:准备两个栈(inStack,outStack)

入队:将元素push进inStack中

出队:如果outStack为空,由于出队要从队头出,那么把inStack中的元素push进outStack,再pop栈顶元素

如果不为空,比如已弹出一个元素其他元素还在里面,还是pop栈顶元素

 

class MyQueue {
    private Stack<Integer> inStack;
    private Stack<Integer> outStack;
    public MyQueue() {
        inStack = new Stack<>();
        outStack = new Stack<>();
    }
    //入队
    public void push(int x) {
        inStack.push(x);
    }
    //出队
    public int pop() {
        if(outStack.isEmpty()){
            while(!inStack.isEmpty()){  //如果inStack不为空,把inStack内元素放入outStack中
                outStack.push(inStack.pop());
            }
        }
        return outStack.pop();   //弹出栈顶元素
    }
    //获取队头
    public int peek() {
        if(outStack.isEmpty()){
            while(!inStack.isEmpty()){  //如果inStack不为空,把inStack内元素放入outStack中
                outStack.push(inStack.pop());
            }
        }
        return outStack.peek();        
    }
    //判断队列是否为空
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty(); //两个栈都为空
    }
}

 双端队列:在头尾分别都可以添加或删除元素

循环队列:动态数组实现

指针front指向队头,从队头删除元素时,front指针指向下一位;当数组最后一位已被占用且front前尚有空位,添加元素会在前面的空位进行添加;数组满时就动态扩容

front使用int,实际存储的是数组下标

假设front目前位于数组的最后一位,再次添加元素时front需要到数组0位置而不是length+1,所以要写 front = (front + 1) % elements.length

动态扩容:由于是循环的,扩容后希望头指针就指在首元素位置,所以进行front重置;也因此,让newElements找到对应的元素要使用 (i + front) % elements.length;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java栈与队列 的相关文章

随机推荐

  • 蓝桥杯2017年第八届真题-发现环

    题目 题目链接 题解 并查集 DFS 并查集比较明显 因为要判断有没有环 思路也很简单 若不停加边 若两个点的fa是一样的 则说明再加上这两点之间的直接 边就会出现环 因此这两个点一定位于环上 我们以两点中的其中一个点为起点 dfs寻找另一
  • Chromium命令行开关列表1

    Chromium命令行开关列表 Google Chrome浏览器可以使用很多命令行 一些更改功能的行为 其他用于调试或试验 该页面列出了可用的开关 包括其条件和说明 上一次自动更新发生在2020 08 12 Condition Explan
  • Ubuntu下ffmpeg的安装与配置

    安装 配置 FFmpeg包括了目前领先的音 视频编码库libavcodec 提供了录制 转换以及流化音视频的完整解决方案 其强大的功能包括视频采集功能 视频格式转换 视频抓图 给视频加水印等 安装 安装FFmpeg前 需要先安装依赖库 su
  • 完美解决Python各种no module named "XX"问题

    在腾讯云上玩Django 但总是遇到no module name django core wsgi 等问题 在django的 error log中也提示是 no module 但是 本地 python3 wsgi py或者 python3
  • Firefly安装说明

    第三方库依赖 twisted python memcached DBUtils MySQLdb 安装第三方库 1 easy install twisted windows下可以直接用Twisted 12 2 0 win32 py2 6 ex
  • 十年大厂产品的数据分析宝典(下):数据打点、分析、做图表、监控的实用技巧

    序 上半部分文章主要围绕指标 包括选定关键指标 主要指标VS次要指标 从关键结果指标拆解出过程指标 并定下阶段性目标 这些是数据分析的基础工作 在没有做好之前 不建议直接就开始做功能 打点取数等等 如果这部分已经做好了 那么可以看接下来的文
  • 一些测开面试题及答案(个人梳理)

    这里写目录标题 答案对错自辨 文明观看 有错给我说我改 1 白盒测试 黑盒测试 1 1白盒测试 1 2黑盒测试 2 测试流程 3 bug流程 4 压力测试 5 selenium原理 6 选取元素方法 7 servlet生命周期 8 Java
  • Baseline、Benchmark&SOTA

    Baseline Baseline A baseline is a value or starting point on a scale with which other values can be compared 通俗的讲 一个算法被称
  • 一个通过cookie实现的账号密码保存的案例(会分享cookie设置获取删除的封装函数哦)

    相信大家都玩过QQ 但细心地你是否发现有个保存密码的功能 当你选中保存账号密码时 等你下次登录的时候 将直接为你显示出来你的账号密码 省去了我们再次输入的时间 那么这样一个功能是如何实现的呢 我现在通过cookie简单为大家实现一下这个功能
  • 第六章树和二叉树-作业3-Huffman树

    判断题 1 1 对N 2 个权值均不相同的字符构造哈夫曼树 则树中任一非叶结点的权值一定不小于下一层任一结点的权值 T 选择题 2 1 对N N 2 个权值均不相同的字符构造哈夫曼树 下列关于该哈夫曼树的叙述中 错误的是 D A 树中一定没
  • XXE漏洞原理--简单理解

    XXE漏洞简介 1 XXE漏洞全称XML External Entity Injection 即xmI外部实体注入漏洞 XXE漏洞发生在应用程序解析XML输入时 没有禁止外部实体的加载 导致可加载恶意外部文件 造成文件读取 命令执行 内网端
  • 提供HTTP、HTTPS都可访问的API

    情景说明 考虑到数据的安全传输 现在用到HTTPS进行API调用的越来越多了 本节就介绍如何使自己编写的API能让别人 进行HTTP HTTPS调用 先看一下一般情况 正常编写一个 使用HTTP访问一下 不写的话 默认使用HTTP协议进行访
  • 八、模板方法模式

    定义 模板方法模式 在一个方法中定义一个算法骨架 而将一些步骤延迟到子类中 模板方法使得子类可以在不改变算法结构的情况下 重新定义算法中的某些步骤 UML类图 说明 1 AbstractClass抽象中包含了模板方法 primitiveOp
  • ERC20的创建及合约之间的调用(合约调用合约)

    ERC20 Token ERC20是一个token合约标准 具体的概念和友好的合约库 可参考openzeppelin 接下来的代码创建一个erc20 token SPDX License Identifier GPL 3 0 pragma
  • webupload 实现大文件分片上传

    废话不多说 直接上例子 html代码 div class layui form item div
  • 1.Ros初学笔记

    1 创建workspace 名字是catkin ws mkdir p catkin ws src 2 初始化环境 生成build 编译成功的可执行文件 devel src 代码包 cd catkin ws catkin make 3 为了让
  • Ubuntu JetBrains(JetBrains Account Error:JetBrains Account connection error: www.jetbrains.com)

    问题 Your host may be behind a proxy 在使用学生免费账户登录的时候出现错误 解决 修改 etc hosts文件 将其中的 jetbrains的相关行去掉即可
  • Over-COM:一种可折叠的头部医疗支架

    为了帮助医生对颅内疾病进行更精准的诊断 来自中国的Lailu Li科研团队设计了一个架空可折叠的头部支架 Over COM 该支架包括一个固定在患者头部的装置 外壳 8个线性执行器和1个IMU 惯性测量单元 以及一个远离病人的小盒子 包含微
  • Doc2vec计算文本相似度

    1 Doc2vec模型介绍 Doc2Vec模型基于Word2vec模型 并在其基础上增加了一个段落向量 以Doc2Vec的C BOW方法为例 算法的主要思想在以下两个方面 训练过程中新增了paragraph id 即训练语料中每个句子都有一
  • java栈与队列

    3 栈 栈是一种特殊的线性表 栈只能在一端 栈顶 进行操作 往栈里添加元素叫入栈 删除栈里的元素叫出栈 后进的元素先出 官方栈 java util Stack 栈的应用 浏览器的前进与后退 如果输入三个网址 假设123三个 出栈过程 后退操