原理来自百度百科

一、队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。故队列又称为先进先出(FIFO—first in first out)线性表。

二、顺序队列

建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

每次在队尾插入一个元素是,rear增1;每次在队头删除一个元素时,front增1。随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,称为空队列。当rear增加到指向分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过得存储单元。
顺序队列中的溢出现象:
(1) "下溢"现象:当队列为空时,做出队运算产生的溢出现象(数组已经为空了继续取出元素没有意义)。“下溢”是正常现象,常用作程序控制转移的条件。
(2)"真上溢"现象:当队列满时,继续做进栈运算产生空间溢出的现象(数组越界)。“真上溢”是一种出错状态,应设法避免。
(3)"假上溢"现象:由于头尾指针都不断前移,超出向量空间。这时整个向量空间及队列是空的却产生了"上溢"现象。

顺序队列的数组实现

package com.jalja.org.arith;

public class MySeQuence<E> {
private Object [] arr;
private int maxSize;
private int index;//当前有效数据指针
private int front;//队头指针front
private int rear;//队尾指针rear public MySeQuence(int maxSize){
this.arr=new Object[maxSize];
this.front=0;
this.rear=0;
this.index=0;
this.maxSize=maxSize;
}
//加入队列
public void push(E e) {
arr[rear]=e;
rear++;
index++;
}
//出队列
public E pop() {
if(isNull()) {
throw new RuntimeException("MySeQuence is null");
}
E e=(E)arr[front];
front++;
index--;
return e;
}
//查询队列内元素的个数
public int getSize() {
return index;
}
//判断队列是否为空
public boolean isNull() {
return front==rear;
}
//队列是否满了 true=满了
public boolean isFull() {
return rear==maxSize;
}
public static void main(String[] args) {
MySeQuence<Integer> myQueue=new MySeQuence<>(3);
myQueue.push(1);
myQueue.push(2);
myQueue.push(3);
System.out.println(String.format("元素个数:%s",myQueue.getSize()));
System.out.println(String.format("队列是否满了:%s",myQueue.isFull()));
while(!myQueue.isNull()) {
System.out.println(myQueue.pop());
}
System.out.println(String.format("元素个数:%s",myQueue.getSize()));
System.out.println(String.format("队列是否为空:%s",myQueue.isNull()));
}
}

该实现会出现假上溢,当然这也是顺序队列的特点。我们一般使用循环队列解决这种问题。

三、循环队列

把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。

循环队列实现原理:

1、无论插入或删除,一旦rear指针增1或front指针增1 时超出了所分配的队列空间,就让它指向这片连续空间的起始位置,可用取余运算rear%MaxSize和front%MaxSize来实现。

2、在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize+1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了;因此,队列判空的条件时front=rear,而队列判满的条件时front=rear%MaxSize。

 循环队列数组的实现

package com.jalja.org.arith;

public class MyCirQuence<E> {
private Object [] arr;
private int maxSize;
private int index;//当前有效数据指针
private int front;//队头指针front
private int rear;//队尾指针rear public MyCirQuence(int maxSize){
this.arr=new Object[maxSize+1];
this.front=0;
this.rear=0;
this.index=0;
this.maxSize=maxSize;
}
//加入队列 在除法计算中 余数一定要比除数小
public void push(E e) {
if(isFull()) {
throw new RuntimeException("MySeQuence is full");
}
arr[rear%maxSize]=e; //数组的下表在循环 rear%maxSize
rear++;//real 一直在增加
index++;
}
//出队列 余数一定要比除数小
public E pop() {
if(isNull()) {
throw new RuntimeException("MySeQuence is null");
}
E e=(E)arr[front%maxSize];
front++;
index--;
return e;
}
//查询队列内元素的个数
public int getSize() {
return index;
}
//判断队列是否为空
public boolean isNull() {
return front==rear;
}
//队列是否满了 true=满了
public boolean isFull() {
return !isNull() && front==rear%maxSize;
}
public static void main(String[] args) {
MyCirQuence<Integer> myQueue=new MyCirQuence<>(3);
myQueue.push(1);
myQueue.push(2);
myQueue.push(3); System.out.println("==>:"+myQueue.pop());
System.out.println("==>:"+myQueue.pop());
System.out.println("==>:"+myQueue.pop()); myQueue.push(4);
myQueue.push(5);
myQueue.push(6); while(!myQueue.isNull()) {
System.out.println(myQueue.pop());
} }
}

java 数据结构与算法---队列的更多相关文章

  1. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  2. Java数据结构和算法(五)——队列

    队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...

  3. Java数据结构和算法(二)--队列

    上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

  6. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  7. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  8. Java数据结构和算法 - 高级排序

    希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...

  9. Java数据结构和算法 - OverView

    Q: 为什么要学习数据结构与算法? A: 如果说Java语言是自动档轿车,C语言就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从1档开到4档,而且未必 ...

随机推荐

  1. Python函数之总结

    ''' 1.什么是函数 函数就是具备某一特定功能的工具 2.为什么用函数 减少重复代码 增强程序的扩展性 增强可读性 3.如何用函数 1.函数的使用原则:先定义后调用(*****) 定义阶段:只检测语 ...

  2. Python调用matplotlib实现交互式数据可视化图表案例

    交互式的数据可视化图表是 New IT 新技术的一个应用方向,在过去,用户要在网页上查看数据,基本的实现方式就是在页面上显示一个表格出来,的而且确,用表格的方式来展示数据,显示的数据量会比较大,但是, ...

  3. javascript中encodeURI和decodeURI方法使用介绍

    encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误, 所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字 ...

  4. DIV样式汇总

    DIV样式汇总 最近在学习JavaScript,在做到个要控制控件样式的例子时,突然有了把常用样式汇总一下的想法,于是乎就写了以下内容,以下是以div为例来汇总的,希望对大家有些帮助. 一.常用属性: ...

  5. python中变量的数据类型总结

    1.变量的数据类型,分为数值型和非数值型 数值型: int(整型) float(浮点型) bool (布尔型,只有True和Flase) compex(复数型, 用于科学计算) 非数值型: str(字 ...

  6. Centos6.8配置JDK

    下载jdk-版本号.tar.gz 解压到/usr/local/ vi /etc/profile 最后一行添加如下内容: export JAVA_HOME=/usr/local/jdk-版本号expor ...

  7. Docker Manager for Kubernetes

    一.Kubernetes介绍 Kubernets是Google开源的容器集群系统,是基于Docker构建一个容器的调度服务,提供资源调度,均衡容灾,服务注册,动态伸缩等功能套件: Kubernets提 ...

  8. jsp servlet路径问题

    最近做小作业时饱受路径问题的困扰,记录一下: 当工程目录如上所示时,路径应该这么写: 情况1:根目录下 login.jsp中的表单提交给Servlet时,可以直接写Servlet名: <form ...

  9. Netty源码分析第5章(ByteBuf)---->第7节: page级别的内存分配

    Netty源码分析第五章: ByteBuf 第六节: page级别的内存分配 前面小节我们剖析过命中缓存的内存分配逻辑, 前提是如果缓存中有数据, 那么缓存中没有数据, netty是如何开辟一块内存进 ...

  10. docker pull下来的镜像放哪儿了?

    本机docker版本 docker –version Docker version 1.进入docker 目录 root@Rightsec:~# cd /var/lib/docker root@Rig ...