备案 控制台
开发者社区 开发与运维 文章 正文

数据结构之队列和栈

简介: 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。

一、队列结构

1、基础概念

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

2、特点描述

队列是一个有序列表,可以用数组或是链表来实现,遵循先进先出的原则。即:先进入队列的数据,会先取出;后进入队列的数据,要后取出;即FIFO原则。

入队列示意图

02-1.png

出队列示意图

02-2.png

通过上述两张图解,不难发现队列结构的一些特点:

  • 先进入的数据先出去;
  • 数据从队尾进入,从队首出去;
  • 基于数组描述队列下标变更频繁;
  • 出队列算法可以基于容器大小取模;

队列结构的核心是对容器内是否空、是否满标志的判断算法,即容器为空不可再取,容器已满无法再存;该算法结构在仓储领域的适应非常广泛。

3、消息队列

消息队列就是基于数据结构中的“先进先出”策略实现的,将消息以排队的方式放入队列中,然后出队列被消费:

02-3.png

有时候某类消息消费需要有顺序控制,即可以对消息中的公共ID做取模处理,即把某类消息都置于一个队列中即可。

4、API使用案例

LinkedList类实现Queue队列接口,因此可以基于LinkedList模拟队列效果。

import java.util.LinkedList;
import java.util.Queue;

public class M01_Queue {
    public static void main(String[] args) {
        // 入队列
        Queue<String> queue = new LinkedList<>();
        queue.add("head") ;
        queue.add("middle") ;
        queue.add("tail") ;
        // 当队列出数据之后,size是不断变化的
        int queueSize = queue.size() ;
        int loop = 0 ;
        // 根据队列大小,不断出队列
        while (loop < queueSize) {
            System.out.println(queue.poll());
            System.out.println(queue);
            loop ++ ;
        }
    }
}

二、栈结构

1、基础概念

栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈(push),它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈(pop),它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

2、特点描述

栈是一个先入后出的有序列表,添加和删除只能在栈顶端(Top)操作,另一端为固定的一端,称为栈底(Bottom)。

入栈示意图

02-4.png

出栈示意图

02-5.png

通过上述两张图解,栈结构的一些特点如下:

  • 进栈出栈都要通过栈顶端操作;
  • 进出栈都不移动栈底指针;
  • 进出栈都要移动栈顶指针;

基于栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,从栈容器中而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。

3、递归应用

栈在Java编程中的常见应用,(1)子程序的调用:在跳往子程序前,会将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,退回到原来的程序中;(2)处理递归调用:和子程序的调用类似,除了存储下一个指令的地址外,也要将参数、区域变量等数据存入堆栈中。

4、API使用案例

Stack栈API是Vector的一个子类,它实现了一个标准的后进先出的栈,堆栈只定义了默认构造函数,用来创建一个空栈,堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法。

import java.util.Stack;

public class M02_Stack {
    public static void main(String[] args) {
        // 入堆栈
        Stack<String> stack = new Stack<>() ;
        stack.push("First") ;
        stack.push("Second") ;
        stack.push("Third") ;
        int stackSize = stack.size() ;
        int loop = 0 ;
        // 根据栈大小,不断出栈
        while (loop < stackSize) {
            System.out.println(stack.pop());
            System.out.println(stack);
            loop ++ ;
        }
    }
}
知了一笑
目录
相关文章
Eternity._
|
4天前
数据结构——栈和队列
数据结构——栈和队列
Eternity._
7 1
誓则盟约
|
7天前
|
存储 算法 调度
数据结构与算法-栈篇
数据结构与算法-栈篇
誓则盟约
12 3
西瓜味的敌敌畏
|
21小时前
|
存储 缓存 算法
队列和栈
队列和栈
西瓜味的敌敌畏
13 0
邢仕冲的一亩三分地
|
1天前
顺序栈实现出栈入栈
顺序栈实现出栈入栈
邢仕冲的一亩三分地
5 0
一只大鸽子
|
3天前
数据结构 栈 / 队列(第9天)
数据结构 栈 / 队列(第9天)
一只大鸽子
8 1
Eternity._
|
3天前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
Eternity._
13 4
知更鸟呆呆
|
5天前
|
C语言 C++
【数据结构】C语言实现:栈(Stack)与队列(Queue)
【数据结构】C语言实现:栈(Stack)与队列(Queue)
知更鸟呆呆
12 0
誓则盟约
|
7天前
|
算法 调度 Python
数据结构与算法-队列篇
数据结构与算法-队列篇
誓则盟约
12 3
加油,旭杏
|
15天前
|
存储 缓存 算法
【数据结构】栈和队列的模拟实现(两个方式实现)
【数据结构】栈和队列的模拟实现(两个方式实现)
加油,旭杏
13 1
就学呗
|
7天前
数据结构初阶 栈
数据结构初阶 栈
就学呗
10 1

热门文章

最新文章

  • 1
    云原生数据仓库产品使用合集之在ADB中,如何将源数据的多表(数据结构一致)汇总到一张表
  • 2
    InfluxDB数据模型与数据结构设计详解
  • 3
    Redis入门到通关之数据结构解析-SkipList
  • 4
    《Go 简易速速上手小册》第3章:数据结构(2024 最新版)(上)
  • 5
    《区块链公链数据分析简易速速上手小册》第3章:区块链数据结构(2024 最新版)(下)
  • 6
    《区块链公链数据分析简易速速上手小册》第3章:区块链数据结构(2024 最新版)(上)
  • 7
    Oracle SQL*Plus的DESCRIBE命令:数据结构的“侦探”
  • 8
    可视化数据结构——让你的树跃然纸上
  • 9
    Redis入门到通关之Redis数据结构-String篇
  • 10
    Redis入门到通关之Redis数据结构-List篇
  • 1
    【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(二)
    99
  • 2
    【C++ 数据结构与算法 一站式备考指南】一文掌握 数据结构与算法课程 知识点(一)
    60
  • 3
    【软件设计师备考 专题 】数据结构深度解析:从数组到图
    63
  • 4
    揭秘数组:数据结构的基石与代码实践解析
    11
  • 5
    Java 学习路线:基础知识、数据类型、条件语句、函数、循环、异常处理、数据结构、面向对象编程、包、文件和 API
    113
  • 6
    Golang 数据结构:图
    48
  • 7
    C/C++ 数据结构设计与应用(三):运算符重载的策略与实践 (Operator Overloading Strategies and Practices)
    27
  • 8
    C/C++ 数据结构设计与应用(二):自定义数据结构的设计 (Design of Custom Data Structures)
    69
  • 9
    C/C++ 数据结构设计与应用(一): 数据结构的选择与应用 (Data Structure Selection and Application)
    46
  • 10
    【手撕数据结构】二分查找(好多细节)
    19
  • 相关课程

    更多
  • Go语言核心编程 - 数据结构和算法
  • 相关电子书

    更多
  • 如何使用Tair增强数据结构构建丰富在线实时场景
  • Apache Flink 流式应用中状态的数据结构定义升级
  • 低代码开发师(初级)实战教程
  • 下一篇
    2024年阿里云免费云服务器及学生云服务器申请教程参考

    聚圣源暮光之城3净水器公司起名大全集起名废餐饮店铺能起名牛年张姓女宝宝起名水产批发起什么店名好我成为崇祯以后黎字取名起名猪孩子起名宜用游戏起姓名大全土匪传奇电视剧天才宝宝总统爹地伤不起根据八字起公司名大全周记500字呼兰河传主要内容孤儿泪姓何牛年的男孩起什么名字十人联名起诉就是诈骗校园环境4444k零报告制度血观音百度云新生儿起名网站免费的cad2014注册机玺起名字宝网数据好听女游戏起名www.444hhh.com苍穹录空格符号怎么打淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

    聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化