数据结构之 栈和队列
一、栈
1、描叙
栈和队列是计算机中基本的两个数据结构,栈可以达到后进先出,队列可以先进先出。在实际应用上,我们可以使用栈进行逆序遍历链表,非递归中序遍历二叉树,括号匹配,函数调用等等;可以使用队列对二叉树进行层次遍历,打印机的打印服务,通信中的消息队列等等。
栈的储存规则:
1,栈只能从表的一端存取数据,另一端是封闭的
2,在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。
栈的使用案例1:
浏览器 “回退” 功能的实现,底层使用的就是栈存储结构。
当你关闭页面 A 时,浏览器会将页面 A 入栈;同样,当你关闭页面 B 时,浏览器也会将 B入栈。因此,当你执行回退操作时,才会首先看到的是页面 B,然后是页面 A,这是栈中数据依次出栈的效果。
栈的使用案例2:
栈存储结构还可以帮我们检测代码中的括号匹配问题。
多数编程语言都会用到括号(小括号、中括号和大括号),括号的错误使用(通常是丢右括号)会导致程序编译错误,而很多开发工具中都有检测代码是否有编辑错误的功能,其中就包含检测代码中的括号匹配问题,此功能的底层实现使用的就是栈结构。
2、图文示例
先进后出
3、代码示例
package stackAndQueue;/*** TODO 栈,先进后出*/
public class Stack {// 底层基于数组private int[] arr;// 数据长度, 最后一个数据的索引=数据长度-1private int size;// 容量设置public Stack() {arr = new int[16];}public Stack(int length) {arr = new int[length];}/*** 添加*/public void plus(int val) {arr[size++] = val;}/*** 获取并弹出元素, 最后一个数据的索引=size-1*/public int pop() {return arr[--size];}/*** 判断是否为空*/public boolean isEmpty() {return size == 0;}/*** 容量是否满了,添加可先判断容量,进行扩容操作*/public boolean isFull() {return size == arr.length;}
}
测试代码
// 测试
class Test {public static void main(String[] args) {Stack stack = new Stack(5);stack.plus(1);stack.plus(2);stack.plus(3);stack.plus(4);stack.plus(5);System.out.println("容量是否满了-->" + stack.isFull());while (!stack.isEmpty()) {System.out.println(stack.pop());}}
}// 输出
容量是否满了-->true
5
4
3
2
1
二、队列
1、描叙
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。 [1]
队列的实现
队列存储结构的实现有以下两种方式:
顺序队列:在顺序表的基础上实现的队列结构;
链队列:在链表的基础上实现的队列结构;
两者的区别仅是顺序表和链表的区别,即在实际的物理空间中,数据集中存储的队列是顺序队列,分散存储的队列是链队列。
队列的实际应用
实际生活中,队列的应用随处可见,比如排队买 XXX、医院的挂号系统等,采用的都是队列的结构。
拿排队买票来说,所有的人排成一队,先到者排的就靠前,后到者只能从队尾排队等待,队中的每个人都必须等到自己前面的所有人全部买票成功并从队头出队后,才轮到自己买票。这就不是典型的队列结构吗?
2、图文示例
普通队列
先进先出
循环队列
先进先出
3、代码示例
package stackAndQueue;/*** TODO 队列,先进先出*/
public class Queue {// 底层基于数组private int[] arr;// 数据长度private int size;// 开头元素索引 (每获取一次数据 front+1)private int front;// 结尾元素索引(每添加一次数据rear+1,每获取一次数据rear-1 )--> 数据长度=rear+1private int rear;// 容量设置public Queue() {arr = new int[16];front = -1;rear = -1;}public Queue(int length) {arr = new int[length];front = -1;rear = -1;}/*** 获取当前数据长度*/public int size() {return this.size;}/*** 插入元素*/public void plus(int val) {// 判断数组是否满了if (isFull()) {System.out.println("插入["+val+"]失败,数组容量已满");} else {// 循环插入,--元素尾添加if (rear == arr.length - 1) {rear = -1;}size++;arr[++rear] = val;}}/*** 获取并弹出元素*/public int pop() {// 循环读取--元素头开始读取if (front == arr.length - 1) {front = -1;}size--;return arr[++front];}/*** 判断元素是否为空*/public boolean isEmpty() {return size == 0;}/*** 容量是否满了,添加可先判断容量,进行扩容操作*/public boolean isFull() {return size == arr.length;}
}
测试代码
// 测试
class Test1 {public static void main(String[] args) {Queue queue = new Queue(5);queue.plus(1);queue.plus(2);queue.plus(3);queue.plus(4);queue.plus(5);System.out.println("容量是否满了-->" + queue.isFull() + " 当前数据长度:" + queue.size());//消费--> size=0while (!queue.isEmpty()) {System.out.println(queue.pop());}// 添加数据,size=0queue.plus(6);queue.plus(7);queue.plus(8);queue.plus(9);queue.plus(10);System.out.println("弹出--> " + queue.pop());queue.plus(11);//queue.plus(12);queue.plus(13);queue.plus(14);while (!queue.isEmpty()) {System.out.println(queue.pop());}}
}// 打印
容量是否满了-->true 当前数据长度:5
1
2
3
4
5
弹出--> 6
插入[12]失败,数组容量已满
插入[13]失败,数组容量已满
插入[14]失败,数组容量已满
7
8
9
10
11
本文到此结束,如果觉得有用,劳烦各位点赞关注一下呗,将不定时持续更新更多的内容…,感谢大家的观看!
数据结构之 栈和队列相关推荐
- 【数据结构】栈、队列、堆的python实现
[数据结构]栈.队列.堆的python实现 一.栈的python实现 1.1.栈的列表实现方法 1.2.用双向队列模拟栈 二.队列的python实现 2.1.队列的列表实现 2.2.使用deque实现 ...
- C语言【数据结构】栈和队列【OJ题(C++)、选择题】
目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...
- 数据结构~07.栈和队列的基本概念
数据结构~07.栈和队列的基本概念 本文是上一篇文章的后续,详情点击该链接~ 栈的定义: 栈是一种只能在一端进行插入或删除的线性表.其中,允许插入或删除的一端为栈顶(TOP).栈顶由一个称为栈顶指针的 ...
- 10.数据结构:栈和队列
大家好,我王有志又回来啦.关注王有志,回复DSA获取数据结构和算法学习资源. 最近被全链路优化搞得焦头烂额,等抽出时间来和大家分享下我司正在做的"全面提速工程". 今天我们来学习线 ...
- 【数据结构】栈与队列区分push pop offer poll containsKey put等
目录 前言 正文 队列 栈 map集合 前言 算法中经常会用到栈和队列等数据结构 但是经常弄混他们的进与取的代码算法 此文主要是做一个区分度 用法以及注意事项详情可看我之前的文章 [数据结构]栈和队列 ...
- 算法与数据结构(part5)--栈与队列
学习笔记,仅供参考,有错必纠 文章目录 算法与数据结构–基于python 栈 栈是什么 栈(ADT)的操作 栈的实现 队列 队列是什么 队列的操作 队列的实现 双端队列 双端队列是什么 双端队列的操作 ...
- 数据结构03栈和队列
第三章栈和队列 STL 栈:stack http://blog.csdn.net/weixin_37289816/article/details/54773495 队列: queue http:// ...
- 用Java描述数据结构之栈和队列,以及栈和队列的常用方法
一般都是在学完线性表(顺序表和链表)之后,才会去学习栈和队列,因此可能会觉得栈和队列是一种新的数据结构,其实不然.它们逻辑上还是一对一的关系,所以说它们本质还是线性表,只不过是加了一定限制的线性表,具 ...
- 数据结构 3-0 栈与队列总结
总结 栈和队列都可以看作对输入输出做限制的线性表.其中栈是限制了输入和输出只能在一端进行的线性表,可以将其看作向箱子里面摞书,想要取出最下面的书必须要先拿出上面的书,对应栈先进后出的特点.而队列正如其 ...
- JAVA day16、17 数据结构(栈、队列、数组、链表、红黑树)
一.什么叫数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带"结构"的数据元素的集合."结构"就是指数据元素之间存在的关系,分为逻辑结构 ...
最新文章
- Django restfulframework 开发相关知识 整理
- Java并发编程中级篇(一):使用Semaphore信号量进行并发控制
- shell 中定义数组
- 部署文档撰写经验分享
- CycleGAN非配对图像生成,定制你的卡通照
- Python—字典(当索引不好用时)
- 同济大学 线性代数 第六版 pdf_线性代数同济第六版第五章课后习题答案!
- 新 Nsight Graph、Nsight Aftermath 版本中的性能提升和增强功能
- 论文中插入高分辨率(dpi)图片
- 苹果系统摩尔庄园是什么服务器,摩尔庄园手游iOS
- 计算机无法装补丁,老司机教你win7 sp1补丁安装失败怎么办
- GitLab(三)创建用户
- nvidia Compute Capability(GPU)
- RStudio不在Plots中显示图片的一个原因
- 深度学习之波士顿房价预测(一)
- Windows挂载Linux网络共享文件夹
- 单叶双曲面母直线参数的几何意义
- MACD详细计算方法及例子
- 开发人员为什么要选择APL(抽象编程语言)平台?
- 星际反作弊2.3for-win7-xp-win8-win10
热门文章
- 面试官:讲讲Bean的加载过程
- 游戏用的计算机语言,编程游戏在计算机语言中的运用分析
- 数据库锁表的查询和处理
- 解决彩虹六号 2020 第二赛季更新后无法锁亚服
- 创业阶段如何找客户_怎么才叫创业 创业分为哪几个阶段?
- Java产生随机数函数
- 铝桁架梁的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 智能家居技术冲击科技市场?为什么智能家居越来越受关注?
- Win11小组件怎么添加待办事项?Win11添加待办事项小组件的方法
- 电子计算机音乐老响怎么回事,电脑外放音乐带有杂音怎么回事?电脑外放音乐带有杂音解决方法...