原理来自百度百科

一、队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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. 400 bad Request: JackSon将json串转成List<Object>,异常com.fasterxml.jackson.databind.JsonMappingException

    最近遇到的400, 以前总以为 400 就是参数不匹配造成的,直到今天遇到这个问题 控制台报错如下:  com.fasterxml.jackson.databind.JsonMappingExcept ...

  2. linux 之 jq

    1.安装 mac 安装: brew install jq centos 安装: yum install jq ubuntu: 安装: apt-get install jq 2.使用 cat test. ...

  3. 如何实现Canvas图像的拖拽、点击等操作

    上一篇Canvas的博文写完后,有位朋友希望能对Canvas绘制出来的图像进行点击.拖拽等操作,因为Canvas绘制出的图像能很好的美化.好像是想做炉石什么的游戏,我也没玩过. Canvas在我的理解 ...

  4. PHP 用户密码加密函数password_hash

    传统的用户名和密码都采用加盐的方式存储加密信息,盐值也需要存储. 自PHP5.5.0之后,新增加了密码散列算法函数(password_hash),password_hash() 使用足够强度的单向散列 ...

  5. 使用Java Socket手撸一个http服务器

    原文连接:使用Java Socket手撸一个http服务器 作为一个java后端,提供http服务可以说是基本技能之一了,但是你真的了解http协议么?你知道知道如何手撸一个http服务器么?tomc ...

  6. 精确的double加减乘除运算工具类

    import java.math.BigDecimal; /** * 精确的double加减乘除运算 * @author cyf * */ public class DoubleUtil { /** ...

  7. 011 --Mysql中特定查询

    1.优化COUNT()查询 COUNT()可能是被大家误解最多的函数了,它有两种不同的作用,其一是统计某个列值的数量,其二是统计行数.统计列值时,要求列值是非空的,它不会统计NULL.如果确认括号中的 ...

  8. ats编译中增加透明度 选项

    在大多数情况下,如果环境支持透明度,则configure将自动启用它.对于其他环境,可能需要 配置configure 选项. --enable-posix-cap 这实现了POSIX功能,这是透明度所 ...

  9. ovs源码阅读--netlink使用

    netlink netlink socket是一种用于用户态进程和内核态进程之间的通信机制.它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯 ...

  10. Maven打包jar类库

    项目目录>mvn clean compile 编译命令,会在你的项目路径下生成一个target目录,在该目录中包含一个classes文件夹,里面全是生成的class文件及字节码文件. 项目目录& ...