一、栈

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

本文到此结束,如果觉得有用,劳烦各位点赞关注一下呗,将不定时持续更新更多的内容…,感谢大家的观看!

数据结构之 栈和队列相关推荐

  1. 【数据结构】栈、队列、堆的python实现

    [数据结构]栈.队列.堆的python实现 一.栈的python实现 1.1.栈的列表实现方法 1.2.用双向队列模拟栈 二.队列的python实现 2.1.队列的列表实现 2.2.使用deque实现 ...

  2. C语言【数据结构】栈和队列【OJ题(C++)、选择题】

    目录 一.OJ题 1.225. 用队列实现栈 2.232. 用栈实现队列 3.622. 设计循环队列 4.20. 有效的括号 二.选择题 1.下列关于栈的叙述正确的是(B) 2.一个栈的入栈序列为AB ...

  3. 数据结构~07.栈和队列的基本概念

    数据结构~07.栈和队列的基本概念 本文是上一篇文章的后续,详情点击该链接~ 栈的定义: 栈是一种只能在一端进行插入或删除的线性表.其中,允许插入或删除的一端为栈顶(TOP).栈顶由一个称为栈顶指针的 ...

  4. 10.数据结构:栈和队列

    大家好,我王有志又回来啦.关注王有志,回复DSA获取数据结构和算法学习资源. 最近被全链路优化搞得焦头烂额,等抽出时间来和大家分享下我司正在做的"全面提速工程". 今天我们来学习线 ...

  5. 【数据结构】栈与队列区分push pop offer poll containsKey put等

    目录 前言 正文 队列 栈 map集合 前言 算法中经常会用到栈和队列等数据结构 但是经常弄混他们的进与取的代码算法 此文主要是做一个区分度 用法以及注意事项详情可看我之前的文章 [数据结构]栈和队列 ...

  6. 算法与数据结构(part5)--栈与队列

    学习笔记,仅供参考,有错必纠 文章目录 算法与数据结构–基于python 栈 栈是什么 栈(ADT)的操作 栈的实现 队列 队列是什么 队列的操作 队列的实现 双端队列 双端队列是什么 双端队列的操作 ...

  7. 数据结构03栈和队列

    第三章栈和队列 STL 栈:stack http://blog.csdn.net/weixin_37289816/article/details/54773495 队列: queue  http:// ...

  8. 用Java描述数据结构之栈和队列,以及栈和队列的常用方法

    一般都是在学完线性表(顺序表和链表)之后,才会去学习栈和队列,因此可能会觉得栈和队列是一种新的数据结构,其实不然.它们逻辑上还是一对一的关系,所以说它们本质还是线性表,只不过是加了一定限制的线性表,具 ...

  9. 数据结构 3-0 栈与队列总结

    总结 栈和队列都可以看作对输入输出做限制的线性表.其中栈是限制了输入和输出只能在一端进行的线性表,可以将其看作向箱子里面摞书,想要取出最下面的书必须要先拿出上面的书,对应栈先进后出的特点.而队列正如其 ...

  10. JAVA day16、17 数据结构(栈、队列、数组、链表、红黑树)

    一.什么叫数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带"结构"的数据元素的集合."结构"就是指数据元素之间存在的关系,分为逻辑结构 ...

最新文章

  1. java猴子吃香蕉_Java 猴子分香蕉
  2. Spring boot (6)---SpringMVC框架和spring Boot的区别
  3. 到底什么是 ROI Pooling Layer ???
  4. Java面试必问!2020-08-28(1)
  5. Nginx代理服务器使用
  6. 用 AlphaGo Zero 参加阿里巴巴全球调度算法大赛
  7. 乐优购物学习笔记(5)
  8. web前端(HTML5)
  9. 日月年时分秒转换为年月日时分秒
  10. mysql条件关键字查询有limt_MySQL使用Limit关键字限制查询结果的数量-Go语言中文社区...
  11. 火狐浏览器不兼容event问题
  12. 高分1(GF1)、高分2(GF2)卫星数据大气校正
  13. python 通达信板块_[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上...
  14. Win10家庭版gpedit.msc命令打不开组策略的解决方案
  15. node.js+vue+elementui餐厅外卖团购点餐限时秒杀网站平台
  16. 开启Windows11休眠功能
  17. android按钮好看的样式
  18. odoo定义view表自定义sql来创建表及反写操作
  19. linux如何查询某个关键字所处在哪个文件夹的哪个文件下
  20. python 英语翻译_Python有哪些好用的语言翻译方法

热门文章

  1. 公众号怎么设置滑动文字_公众号中怎么制作文字滚动播放?
  2. 整理:一些主流的编程竞赛网站 对比
  3. 错误 330 (net::ERR_CONTENT_DECODING_FAILED):未知错误解决办法
  4. matlab2015 产品目录,MathWorks发布包含MATLAB和Simulink产品系列的 Release 2015b-EDA/PCB-与非网...
  5. 【Python】教你如何快速给证件照更换底色
  6. Linux中编辑文档
  7. Mac Dashboard图标整理,图标按文件夹分类,APP归类,快速搜索
  8. 单例模式之懒汉与饿汉
  9. Teaming和Bonding实现双网卡绑定一起来看。
  10. qdialog 返回值_PyQt QDialog - 返回一个值并从对话框中关闭