队列定义

队列(queue )简称队,它同堆栈一样,也是一种运算受限的线性表,
其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
在队列中把插入数据元素的一端称为 队尾(rear) ),删除数据元素的一端称为 队首(front) )。
向队尾插入元素称为 进队或入队,新元素入队后成为新的队尾元素;
从队列中删除元素称为 离队或出队,元素出队后,其后续元素成为新的队首元素。
由于队列的插入和删除操作分别在队尾和队首进行,每个元素必然按照进入的次序离队,
也就是说先进队的元素必然先离队,所以称队列为 先进先出表(First In First Out,简称FIFO)。

生活案例:排队打饭,排队进地铁站,上地铁
技术案例:多线程中就绪队列和阻塞队列

对于队列的主要操作是入队和出队操作

队列的存储结构

顺序队列

方法1:使用数组作为存储结构:

缺点:通过出队操作将数据弹出队列后,front之前的空间还能够再次得到吗?
不能。所以使用普通数组实现队列,就再也不能使用front之前的空间了,这会导致大量空间丢失

方法2:使用循环数组作为存储结构:
为了解决这个问题,将普通数组换成循环数组。在循环数组中,末尾元素的下一个元素不是数组外,而是数组的头元素。
这样就能够再次使用front之前的存储空间了

链式队列

队列的链式存储可以使用单链表来实现。
为了操作实现方便,这里采用带头结点的单链表结构。
根据单链表的特点,选择链表的头部作为队首,链表的尾部作为队尾。
除了链表头结点需要通过一个引用来指向之外,还需要一个对链表尾结点的引用,以方便队列的入队操作的实现。
为此一共设置两个指针,一个队首指针和一个队尾指针,如图 所示。
队首指针指向队首元素的前一个结点,即始终指向链表空的头结点,队尾指针指向队列当前队尾元素所在的结点。
当队列为空时,队首指针与队尾指针均指向空的头结点

双端队列deque double ended queue 通常读为"deck"

所谓双端队列是指两端都可以进行进队和出队操作的队列,如下图所示,将队列的两端分别称为前端和后端,两端都可以入队和出队。其元素的逻辑结构仍是线性结构

在双端队列进队时:前端进的元素排列在队列中后端进的元素的前面,后端进的元素排列在队列中前端进的元素的后面。在双端队列出队时,无论前端出还是后端出,先出的元素排列在后出的元素的前面。

输出受限的双端队列,即一个端点允许插入和删除,另一个端点只允许插入的双端队列。

输入受限的双端队列,即一个端点允许插入和删除,另一个端点只允许删除的双端队列。

双端队列既可以用来实现队列操作,也可以用来实现 栈操作 (只操作一端就是栈了)

Java中的栈和队列

Stack类:栈类 过时 public class Stack extends Vector
Queue(接口):队列类
Deque(接口):双端队列(栈操作建议使用)

public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable
public interface Deque <E> extends Queue<E>   扩展了java.util.Collection接口

双端队列

public interface Queue<E> extends Collection<E>  扩展了java.util.Collection接口

Queue 使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。

所以Java中实现栈和队列操作都可以通过使用LinkedList类实现,当然底层使用的链表.

public class ArrayDeque <E> extends AbstractCollection<E>implements Deque<E>, Cloneable, SerializableArrayDeque 是 Deque 接口的大小可变数组的实现

代码:

/**
* 功能:模拟生活中落盘子案例
* 技能: LinkedList
*
* LinkedList 既可以当做线性表处理,也可以当做栈、队列使用
* @author Administrator*
*/
public class TestDeque {public static void main(String[] args ) {// 创建一个栈Deque deque =   new LinkedList ();                // 罗盘子 : 入栈
//                deque.addFirst(" 盘子 1");
//                deque.addFirst(" 盘子 2");
//                deque.addFirst(" 盘子 3");deque .push( " 盘子 1" );deque .push( " 盘子 2" );deque .push( " 盘子 3" );                // 获取最上面的盘子:获取栈顶元素
//                System.out.println(deque.getFirst());
//                System.out.println(deque.getFirst());
//                System.out.println(deque.getFirst());System. out . println ( deque .peek());System. out . println ( deque .peek());System. out . println ( deque .peek());                // 拿走盘子:出栈
//                System.out.println(deque.removeFirst());
//                System.out.println(deque.removeFirst());
//                System.out.println(deque.removeFirst());System. out . println ( deque .pop());System. out . println ( deque .pop());System. out . println ( deque .pop());}}
/**
* 功能:模拟生活中超市购物排队结算
* 技能:使用 LinkedList 实现队列的操作
*
* @author Administrator
*
*/
public class TestQueue {public static void main(String[] args ) {// 创建一个队列java.util.Queue queue = new LinkedList();                // 入队queue . offer ( " 张三 " );queue . offer ( " 李四 " );queue . offer ( " 王五 " );// 获取队头元素System. out .println( queue .element());System. out .println( queue .element());System. out .println( queue .element());// 出队System. out .println( queue .remove());System. out .println( queue .poll());queue . offer ( " 赵六 " );System. out .println( queue .poll());System. out .println( queue .poll());System. out .println( queue .poll());System. out .println( queue .poll());System. out .println( queue .poll());}
}
/**
* 借助栈实现进制转换( 10 ---- 2 )
* @author Administrator
*
*/
public class TestConversion {public static void main(String[] args ) {                int n = 13;int t = n ;//String str = "";Deque<Integer>   deque = new LinkedList<Integer>();while ( t >0){// 除以 2 得到余数作为二进制位int mod = t %2;//System.out.print( mod );// str = mod + str ;deque .push( mod );// 除以 2 得到商作为被除数继续int result = t /2;t = result ;}System. out .print( n + "--------->" );while (! deque .isEmpty()){System. out .print( deque .pop());}                }
}

队列定义、队列的存储结构相关推荐

  1. 队列的链式存储结构及其实现_了解队列数据结构及其实现

    队列的链式存储结构及其实现 A queue is a collection of items whereby its operations work in a FIFO - First In Firs ...

  2. 队列的链式存储结构及实现

    队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和re ...

  3. 队列的链式存储结构(链队)

    链队 1.队列的链式存储结构 typedef struct QNode{ //结点结构QElemType data; //结点数据域struct QNode *next; //结点指针域 }QNode ...

  4. Python数据结构与算法基础|第五期:代码实现——循环队列的链式存储结构

    在上一次,我们通过取余等数学方法实现了顺序存储的循环队列.由于我们使用的是Python内置的列表类型作为底层,实际上我们的存储空间并不是首尾相连的.下面,我们使用链式存储结构来实现一个真正首尾相连的循 ...

  5. 二叉树的定义 性质 及存储结构

    二叉树的定义和基本术语 二叉树是n个数据元素的有限集,它或为空集(n=0),或者含有唯一的称为根的元素,且其余元素分别分成两个互不相交的子集,每个子集自身也是一颗二叉树,分别称为根的左子树和右子树.集 ...

  6. 第7周实践项目2 队列的链式存储结构及其基本运算的实现

    liqueue.cpp#include <stdio.h> #include <malloc.h> #include "liqueue.h" void In ...

  7. 数据结构教程(第四版)P85~87//队列的链式存储结构

    这个代码一开始出了点问题,在进队列时没有将next指针置为NULL导致后面数据出错,不过好在,我问了一个朋友,才发现这个问题. 在此我要对我这位朋友表示感谢!3Q温小姐 #include<std ...

  8. 队列的链式存储结构的实现:入队、出队

    1.实验内容: (1)用随机函数生成10个3位整数(100~999),把这些整数应用入队操作存于队列中: (2)应用遍历操作输出队列的内容: (3)把队列的内容翻转,应用出队操作输出队列的内容. 2. ...

  9. [数据结构-严蔚敏版]P61ADT Queue的表示与实现(单链队列-队列的链式存储结构)

    代码如下: #include <iostream> using namespace std;typedef int ElemType;typedef struct QNode {ElemT ...

最新文章

  1. nginx php 大小写问题,Nginx实现url请求不区分大小写
  2. 13个JavaScript图表图形绘制插件
  3. RabbitMQ之消息确认机制(事务+Confirm)
  4. python3.4 安装numpy报错_python2.7安装numpy报错:is not a supported wheel on...
  5. Android-上传图片(二)_HttpClient
  6. Spark跟Flink的常见问题
  7. 数据增强 数据集扩充_数据扩充的抽象总结
  8. [转]ASP.NET MVC HtmlHelper扩展之Calendar日期时间选择
  9. 第四篇: UpdatePanel 控件--触发机制Triggers
  10. Windows10 电脑蓝屏方案对照表
  11. 事业单位资产管理系统破解资产管理难题,实现账、卡、物、地、人相符
  12. rails 分页插件 Kaminari 的 数组分页
  13. 微机原理与接口技术期末考试总结
  14. 赛门铁克如何用TAA搞定APT?
  15. 若依如何实现接口限流?
  16. 【机房收费系统个人版】三层登陆
  17. 抢先体验Windows Technical Preview(Windows 10)和Windows Server Technical Preview
  18. 灰度共生矩阵-python
  19. PE文件格式详解(7)
  20. LightOJ 1079 Just another Robbery【概率DP】

热门文章

  1. xml转化为Dictionary
  2. 用node-webkit把web应用打包成桌面应用
  3. 谈谈Groovy闭包
  4. IntelliJ IDEA导入Maven之后强制刷新项目解决无法识别为Maven项目的问题
  5. Python functool module
  6. BZOJ3833 : [Poi2014]Solar lamps
  7. linux多线程编程之互斥锁
  8. [原创].NET 业务框架开发实战之六 DAL的重构
  9. opencv实战3: CascadeClassifier+Haar特征进行人脸检测
  10. OpenCV实战1——图像矫正技术