结构与算法(02):队列和栈结构
本文源码:GitHub·点这里 || GitEE·点这里
一、队列结构
1、基础概念
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
2、特点描述
队列是一个有序列表,可以用数组或是链表来实现,遵循先进先出的原则。即:先进入队列的数据,会先取出;后进入队列的数据,要后取出;即FIFO原则。
入队列示意图:
出队列示意图:
通过上述两张图解,不难发现队列结构的一些特点:
- 先进入的数据先出去;
- 数据从队尾进入,从队首出去;
- 基于数组描述队列下标变更频繁;
- 出队列算法可以基于容器大小取模;
队列结构的核心是对容器内是否空、是否满标志的判断算法,即容器为空不可再取,容器已满无法再存;该算法结构在仓储领域的适应非常广泛。
3、消息队列
消息队列就是基于数据结构中的“先进先出”策略实现的,将消息以排队的方式放入队列中,然后出队列被消费:
有时候某类消息消费需要有顺序控制,即可以对消息中的公共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)。
入栈示意图:
出栈示意图:
通过上述两张图解,栈结构的一些特点如下:
- 进栈出栈都要通过栈顶端操作;
- 进出栈都不移动栈底指针;
- 进出栈都要移动栈顶指针;
基于栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,从栈容器中而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
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 ++ ;}}
}
三、源代码地址
GitHub·地址
https://github.com/cicadasmile/model-arithmetic-parent
GitEE·地址
https://gitee.com/cicadasmile/model-arithmetic-parent
推荐阅读:数据结构和算法
序号 | 文章标题 |
---|---|
01 | 算法和结构(01):稀疏数组和二维数组转换 |
02 | 算法应用:RSA算法,加密解密,签名验签流程详解 |
03 | 算法应用:递归算法,处理树形结构下的业务数据 |
结构与算法(02):队列和栈结构相关推荐
- 先进先出算法_结构与算法(02):队列和栈结构
一.队列结构1.基础概念 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的 ...
- JAVA SE学习day_12:集合的排序、队列、栈结构
一.集合的排序 1.1 集合的排序 集合的工具类java.util.Collections提供了一个静态方法sort,可以对List集合 进行自然排序,即:从小到大 除了自然排序之外还有反转.乱序方法 ...
- 队列与栈结构的相同点与不同点
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 让这个可爱的宝藏女孩在努力的道路上与你一起同行! 如有转载,请 ...
- [算法设计题] 双栈结构
双栈结构 要求 要求编写双栈初始化,判断栈空.栈满.进栈和出栈 已知的双栈结构: typedef struct {int top[2], bot[2]; //栈顶和栈底指针SElemType *V; ...
- 算法开启队列转栈武魂
文章目录 ==**队列接口见 [算法开启小码农队列血脉](https://blog.csdn.net/diandengren/article/details/121072953?spm=1001.20 ...
- 类C语言--栈与队列习题:设从键盘输入一整数的序列:a1, a2, a3,…,an,试编写算法实现:用栈结构存储输入的整数,当ai≠-1时,将ai进栈;当ai=-1时,输出栈顶整数并出栈。算法应对异常
此代码可以正常运行,下附有运行区,是实实在在的类C语言 #include <stdio.h> #include <stdlib.h> #include<string.h& ...
- 【PAT】PAT总结《搜索、打表、分治、排序算法、队列、栈、堆、Hash》
打表 打表这个技巧其实我们在素数部分的题已经涉及到了.还是要仔细思考,什么时候应该打表,打表有助于减少后续的计算的时候,我们应该打表, 特别是查询量特别大,即时计算无论多么快都会超时的情况.或者逆向运 ...
- 数据结构与算法 | 用队列实现栈
上一章实现了用栈来实现队列,这一次我们试试用队列来实现栈. 因为栈的特性是先进后出,队列是先进先出. 所以我们可以想到用两个队列,一个空队列,一个放数据,当我们入队的时候将数据直接放入非空队列,出队的 ...
- 什么叫结构化算法,为什么要提倡结构化算法?
定义:由一些基本结构顺序组成,流程的转移只存在于一个基本的结构范围之内. 优点:便于编写,阅读,修改和维护.减少程序出错的机会,提高程序可读性.
最新文章
- SAP MM MIGO界面上的Freight标签页
- 图像分割matlab_基于MATLAB的指针示数识别
- 在C++中子类继承和调用父类的构造函数方法
- java spring mvc_java spring mvc 全注解
- [转] Android系统如何实现UI的自适应
- 标准WPS框架下的空间信息处理服务部署方法
- json序列化后日期如何变回来
- 中仪股份管道机器人_中仪股份携带管道机器人再次出发美国,携手2018年WEFTEC欢度国庆...
- AD模式下出现NetLogon 5781错误的对策
- Spring揭秘——什么是IOC和DI
- 手动挡你会开吗 八招教你开好手动挡车型
- 【Python教程】python之路
- uni-app如何使用HBuildX云打包发布app
- Python知识点总结(1)
- 新西兰计算机预科学费多少钱,留学新西兰预科学费
- sql中时间的比较方法
- Simulink系统仿真
- CAS-01 关于CAS服务端设置自定义返回参数给CAS-CLIENT
- 怎么做我们自己的微信营销?
- 质因数为2,3,5得数
热门文章
- 面试题17. 打印从1到最大的n位数
- 字扩展、位扩展、字位同时扩展
- Linux日常运维管理技巧(四)文件同步工具-rsync、Linux系统日志、dmesg命令、lastb命令查看登录失败的用户、screen工具虚拟屏幕
- Python list合并(列表合并),dict合并(字典合并)
- VC++CopyFile函数的用法
- Python错误:TypeError: string indices must be integers
- sqlmap使用方法
- 双数据源配置(一个项目中链接两个数据库)
- Ubuntu下apt-get命令详解(转)
- 引入mui后,radio单选框不可点击问题解决