原理来自百度百科

一、队列的定义

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(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. 2_C语言中的数据类型 (一)2.1.常量和字符串常量

    2.1 常量就是在程序中不可变化的量,常量在定义的时候必须给一个初值. 1.1.1          #define 定义一个宏常量 1.1.2          const 定义一个const常量 ...

  2. win8.1下右下角出现大小写切换状态显示框解决方案

    HKEY_LOCAL_MACHINE\SOFTWARE\Cambridge Silicon Radio\Harmony\Default双击右侧 OSD 将键值改成0 重启机器 成功关闭显示

  3. Sqlite数据库sqlite3命令小记

    SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令.本文档提供一个样使用sqlite3的简要说明. 开始 启动sqlite3程序,仅仅需 ...

  4. Micro:bit篮球小游戏

    尝试用Micro:bit制作一款篮球游戏,材料是利用一些纸箱跟生活周遭可以取得的加上Micro;bit,打造出一个好玩的篮球游戏,制作过程也十分简单. 材料清单 先制作篮板. 接着制作篮球架体. 制作 ...

  5. GoLang入门(一)

    1.Go语言的简述 Go语言可能大家对它并不是很了解,因为它相对其他语言来说实在是太年轻了,从创建到现在仅仅十年,09年,谷歌团队初设该想法,到实现也就是10年时间,对于go语言,它不是万能的,每种语 ...

  6. 自己编写的:centos6.6上编译安装apache2.4+php5.6+mysql5.6【亲自】

    在centos6.6上安装apache2.4+php5.6+mysql5.6 关于wget的安装 将之前装系统的.iso文件挂载到光驱 由于我在/home/jinnan/下建立了一个cdrom文件夹 ...

  7. jenkins的时间与服务器的时间不一致

    解决办法:

  8. Python处理PDF和Word文档常用的方法(二)

    Python处理word时,需要安装和导入python-docx模块. 安装命令:pip install python-docx 导入命令:import docx 编码编写顺序:用docx.Docum ...

  9. rename命令详解

    基础命令学习目录首页 原文链接:http://man.linuxde.net/rename 将main1.c重命名为main.c rename main1.c main.c main1.c renam ...

  10. max number of clients reached Redis测试环境报错

    现象:测试服务是去redis循环取数据,早上发现服务挂了,手动登陆redis 无法输入命令,报错:max number of clients reached Redis