算法入门之基本数据结构:队列和栈

2023-10-26

大家都知道,算法和数据结构是息息相关,学习数据结构能帮助我们更好的理解算法,理解编程,这是一种编程思想的培养;今天我们要介绍的数据结构是:队列,可以把队列想象成一个双向管道,一边进另一边出

代码示例

public class QueueDemo {
    public static void main(String[] args) {
        //1.初始化一组数据
        int[] start = {1,2,3,4,5,6,7,8,9};
        //2.初始化一个空队列
        Queue linkedList = new LinkedList<>();
        //3.数据入列
        for (int i = 0; i < start.length; i++) {
            linkedList.offer(start[i]);
          System.out.println("入列:"+JSON.toJSONString(linkedList));
        }
        while (linkedList.size() > 0){
            System.out.print("出列:"+linkedList.poll()+"");
        }
    }
}
结果:入列:[1]
      入列:[1,2]
      入列:[1,2,3]
      ...
      入列:[1,2,3,4,5,6,7,8,9]
      出列:1出列:2出列:3出列:4出列:5出列:6出列:7出列:8出列:9

 

分析

Java中 Queue是一个接口继承Collection接口,我们可以选择一些实现了queue接口的类来构建一个队列,例如本例中的linkedList,从上面结果我们不难发现队列的一些基本特征:

  • 三大组成元素:数据块data,头节点head,尾节点tail

  • 数据为线性结构

  • 先进先出(FIFO)原则

  • 两大操作:只允许在队列的尾部进行添加(入队),只允许在队列的头部进行删除(出队)

     

     

队列的一些其他方法:

  • offer:增加一个元素并返回true                                     (当队列满时返回false)

  • add:增加一个元素            (当队列满时会抛出IIIegaISlabEepeplian异常)

  • poll:移出一个元素并返回移出的元素 (官方说返回的是队列的头部元素,可能指的是移出操作之前的队列   当队列为空则返回null)

  • remove:同poll     (当队列为空时抛出NoSuchElementException异常)

  • peek:返回队列的头部元素        (当队列为空时,返回null)

  • element:返回队列的头部元素(当队列为空时抛出NoSuchElementException异常)

  • 此外还有2个方法是针对阻塞队列的:put(添加元素,队列满时阻塞)和take(移出元素,队列为空时阻塞)

     

延伸

上面我们提到了阻塞队列,例子中的linkedList是非阻塞的,java在开放java.ulil.concurrent的时候提供了BlockingQueue 接口和五个阻塞队列类,后面我们在讲解并发编程时会详细介绍这些队列,这里我们只需要先有个概念就好

 

说完队列,我们再了解下的概念,可以把栈想象成一个单向管道,从一头进,又从该头出

 

代码示例

public class StatckDemo {
    public static void main(String[] args) {
        //1.初始化一组数据
        int[] start = {1,2,3,4,5,6,7,8,9};
        //2.初始化空栈
        Stack stack = new Stack<>();
        //3.入栈 后入的永远在栈顶
        for (int i = 0; i < start.length; i++) {
            stack.push(start[i]);
        }
        //判断栈是否为空
        System.out.println("栈是否为空:"+stack.empty());
        //返回栈顶对象 不删除
        System.out.println(stack.peek());
        System.out.println(JSON.toJSONString(stack));
        //出栈 删除栈顶对象,并返回删除的栈顶对象
        System.out.println(stack.pop());
        System.out.println(JSON.toJSONString(stack));
        //返回对象在栈中的位置,相对于栈顶的位置,
        // 如果对象不存在则返回-1
        System.out.println(stack.search(7));
    }
}
结果:栈是否为空:false
     9
     [1,2,3,4,5,6,7,8,9]
     9
     [1,2,3,4,5,6,7,8]
     2

 

分析

栈与队列不同,可以直接创建使用,继承自Vector类,通过上述例子,我们能总结出栈的一些基本特征:

  • 两大基本组成元素:一维数组块,指向栈顶的变量top值

  • 数据为线性结构

  • 后进先出原则(LIFO)

  • 两大基本操作:入栈(只允许向栈顶添加元素),出栈(只允许从栈顶移出元素)

栈的一些基本方法:

  • empty:判断栈是否为空,返回Boolean值

  • peek:返回栈顶部的元素,不删除该元素

  • pop:删除栈顶元素,并返回该元素(出栈)

  • push:将元素压入栈顶部(入栈)

  • search:返回元素在栈中的位置,以栈顶top为基准,当要返回的值在栈中不存在时,返回-1

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

算法入门之基本数据结构:队列和栈 的相关文章

  • Java 华为真题-新学校选址

    需求 为了解新学期学生暴涨的问题 小乐村要建立所新学校 考虑到学生上学安全问题 需要所有学生家到学校的距离最短 假设学校和所有学生家都走在一条直线之上 请问学校建立在什么位置 能使得到学校到各个学生家的距离和最短 输入描述 第一行 整数n取
  • Python中的自增运算符

    Python中的自增运算符 1 引言 在许多编程语言中 自增运算符 用于将变量的值增加1 然而 在Python中 我们无法直接使用自增运算符来实现自增功能 本文将介绍Python中的自增运算符的替代方法 并提供示例代码来说明其使用方法 2
  • Deep Learning学习 之 CNN代码解析(MATLAB)

    MATLAB实现CNN一般会用到deepLearnToolbox master 但是根据Git上面的说明 现在已经停止更新了 而且有很多功能也不太能够支持 具体的请大家自习看一看Git中的README deepLearnToolbox ma
  • Neo4j数据建模优化:标签 VS 索引

    原文链接 http graphaware com neo4j 2015 01 16 neo4j graph model design labels versus indexed properties html 在设计Neoj图形化数据库的时
  • Docker daemon日志的位置

    Docker daemon日志的位置 根据系统不同各不相同 Ubuntu var log upstart docker log Boot2Docker var log docker log Debian GNU Linux var log
  • SeetaFaceEngine系列1:Face Detection编译和使用

    SeetaFace 根据GitHub上的介绍 就是一个开源的人脸检测 矫正和识别的开源库 是采用C 来编写的 并且是在CPU上执行的 没有用到GPU 但是可以用SSE或者OpenMP来加速 整个库分为三部分 SeetaFace Detect
  • Python Numpy 关于 linspace()函数 使用详解(全)

    目录 前言 1 函数讲解 2 实战讲解 前言 用plt画图的时候 偶尔会看到这个函数的出现 索性直接深入源码实战进行复现 主要功能 在线性区域中生成等间距的序列 原先在Numpy中可以用numpy arange 但对于浮点数会有精度丢失 因
  • web前端开发自学路线是怎样的?html+css+JavaScript的学习方法

    不废话 直接干货 学习前端的几个阶段 一阶段 html标签 html5新增标签 css样式 css3样式 媒体查询等 二阶段 JavaScript jQuery ajax 面向对象 http传输协议等 三阶段 canvas js高级应用 J
  • C++核心:函数提高(函数默认参数、函数占占位参数、函数重载)

    1 函数默认参数 在C 中 函数的形参列表中的形参是可以有默认值的 返回值类型 函数名 参数 默认值 int func int a int b 10 int c 10 return a b c 1 如果某个位置参数有默认值 那么从这个位置往
  • 数据显示为Ljava.lang.Object;@问题

    那是因为你从数据库读出数据后 存入到list集合上时 如果你没有指定要存入的数据的类型 系统会自动给你赋一个object类型 他是所以类的鼻祖 你取出数据要进行转型 转化成你自己想要的数据类型才能显示
  • pod install 报错 [!] Oh no, an error occurred.

    今天在写react native与原生Swift交互的demo时 新建了一个xcode工程SwiftRnApp执行pod install时报错 点开上面的链接 查看CocoaPods issues 说是要把xcodeproj的版本更新到 1
  • 制作立体图像实用软件:3DMasterKit 10.7 Crack

    3DMasterKit 软件专为创建具有逼真 3D 和运动效果的光栅图片而设计 翻转 动画 变形和缩放 打印机 广告工作室 摄影工作室和摄影师将发现 3DMasterKit 是一种有用且经济高效的解决方案 可将其业务扩展到新的维度 提高生成
  • 电脑知识大全菜鸟必备,学计算机零基础入门知识教程

    电脑在我们生活中的重要性不言而喻 如何保证自己的电脑流畅好用 对于很多用户来说是非常重要的 作为一个理科男和IT从业者 我很在意我的电脑 我会定期整理 保持系统绝对流畅好用 那么本文就分享几个保持电脑流畅好用的小技巧和习惯 希望对你有所帮助

随机推荐

  • jupyter python注释多行

    在jupyter notebook中批量注释多行代码 解除注释也是同样的操作 ctrl
  • 如何进行高效迅速的CodeReview

    背景 第一次参加CodeReview不知道该如何去做 也不知道为什么去做 后来参加多了 慢慢了解了CodeReview的意义 也同时发现CodeReview的效率问题 有时候会发现一个CodeReview时间很长 参与者会觉得煎熬和浪费时间
  • 在PADS中如何导出PCB封装库

    1 在 pads layout 下打开 PADS 文件 2 file library Create New Lib 建立一个自己的PCB DECAL 库 3 将 PCB 缩小到可以全部显示 pcb layout 4 按右键 选择 Selec
  • Frp某场景下实现多层代理

    注 由于传播 利用本文章所提供的信息而造成的任何直接或者间接的后果及损失 均由使用者本人负责 本文作者不为此承担任何责任 一旦造成后果请自行承担 目录 frp简介 部分配置参数说明 实验场景 实验场景 实验环境 实验步骤 第一层隧道 第二层
  • ceph学习(故障恢复)——mon全部故障,从osd中恢复集群

    在生产环境中 ceph集群要求最少配置3个MON 一般情况下很少出现3个MON同时挂掉的情况 但是也不排除出现这种情况的可能 如果集群中的所有MON都损坏了 是不是集群数据就丢失了呢 能不能恢复集群 当然是可以的 ceph中国的一位开发者写
  • Python+Selenium基础篇之5-第一个完整的自动化测试脚本

    前面文章 我们介绍了如何采用XPath表达式去定位网页元素 在掌握了如何抓取或者如何书写精确的XPath表达式后 我们可以开始写自己的第一个真正意义上的webui 自动化测试脚本 就相当于 你在学习Python 如何在控制台打印Hello
  • 计蒜客T1488——旋转单词

    如题 抽象本题的重点在于以下几点 1 输入一个字符串并匹配一个专属的数字 2 将每一个字符串后n位按照原顺序前置 对于要点1 此处采用自定义类型压入vector解决 对于要点2 采用双循环遍历解决 具体见代码 include
  • LeetCode 练习——101. 对称二叉树

    文章目录 1 题目描述 2 思路 2 1 代码 2 2 测试结果 3 总结 1 题目描述 对称二叉树 给你一个二叉树的根节点 root 检查它是否轴对称 示例 1 输入 root 1 2 2 3 4 4 3 输出 true 示例 2 输入
  • 详解 Python 文件: .py、.ipynb、.pyi、.pyc、​.pyd !

    这是 进击的Coder 的第 864 篇技术分享 来源 麦叔编程 今天同事给我扔了一个 pyd文件 说让我跑个数据 然后我就傻了 不知道多少粉丝小伙伴会 run pyd 代码文件 如果你也懵懵的 请继续往下读吧 今天科普下各类Python代
  • PAT BASIC LEVEL 1054. 求平均值 (20)

    1054 求平均值 20 本题的基本要求非常简单 给定N个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后2位 当你计算平均值的时候 不能把那些非法的
  • WPF的单线程单元(STA)

    一 问题 在多线程中不能直接访问UI 调用线程必须为 STA 因为许多 UI 组件都需要 二 原因 线程模式分为STA Single Threaded Apartment 单线程单元 和 MTA 多线程单元 Multi Threaded A
  • 常见的十种排序算法C++实现(附时空复杂度,稳定性分析)

    本文主要描述排序算法的实现和大体思路 如果大家不了解其中某种算法 可以先去搜索 看看大概流程 再回来看代码就很清晰了 一 冒泡排序 二 选择排序 三 插入排序 四 希尔排序 五 归并排序 六 快速排序 七 堆排序 八 计数排序 九 基数排序
  • Word 制作三线表

    1 插入绘制表格 2 选中所有表格 点击 字 设置为无线框 3 再次全部选中 点击边框底纹 设置边框为1 5磅 4 选中所有表格 点击边框 设置上框线和下框线 5 打开边框和底纹 设置边框为0 75磅 6 选中第一行 设置下框线 完成 有很
  • Git(4)——Git命令小总结

    一 简介 在Git 3 中 我们已经对Git的三大区域有了更近一步的了解 对于Git有关命令也已经学习了一部分 本篇文章用于对已学习的Git命令做一个总结 二 总结 git init git的初始化 会生成 git的隐藏文件 其中包含了gi
  • FLUENT瞬态模拟动画制作

    首先要初始化计算 然后定义contour图 然后在solution animation中设置相关图像以及设置存储类型 然后点击计算开始计算 计算完毕后在animation 中找到playback 选择相关动画以及输出帧数以及输出类型 输出即
  • python 打包exe文件并隐藏执行CMD命令窗口

    虚拟环境安装 pyinstaller pip install pyinstaller 打包exe命令 具体的命令网上资料很多 打包1个py文件 并隐藏执行窗口 pyinstaller F w main py 打包1个py文件 F 并隐藏执行
  • 最少交换次数

    设有一个序列a a1 a2 a3 序列内的元素可以两两交换位置 现有一个初试序列a 给一个目标序列b 求a变换到b所用最少的交换次数 若不能则给 1
  • 优秀logo设计解析_优秀logo基本设计技巧!

    标志是将信息转化为图形的视觉语言 是一种超越语言 超越地区 超越国界的具有通用性视觉符号 标志设计的基本元素是点 线 面 标志的设计或简单或复杂 或抽象或具象 最终都可以归纳为点 线 面 标志作为企业精神的象征 是具有经济价值的无形资产 如
  • lvgl的内存管理函数

    lvgl的内存分配和释放提供了两套方案 可以通过lv conf h头文件中的宏LV MEM CUSTOM来控制使用哪个方案 该宏定义值为0 则表示使用lvgl内置的内存分配函数lv mem alloc 和lv mem free 该宏定义值为
  • 算法入门之基本数据结构:队列和栈

    大家都知道 算法和数据结构是息息相关 学习数据结构能帮助我们更好的理解算法 理解编程 这是一种编程思想的培养 今天我们要介绍的数据结构是 队列 可以把队列想象成一个双向管道 一边进另一边出 代码示例 public class QueueDe