上一篇文章写了栈的相关知识,而本文会讲一下队列

队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO

Java中queue源码:

public interface Queue<E> extends Collection<E> {

    boolean add(E e);    //添加一条数据到队尾,成功返回true,否则false

    boolean offer(E e);	//添加一条数据到队尾,如果队列满了,会返回null

    E remove();	//从队头删除一条数据,如果是空队列,会发生异常

    E poll();	//从队头删除一条数据,如果是空队列,会返回null

    E element();	//返回队头的数据,如果是空队列,会发生异常

    E peek();	//返回队头的数据,如果是空队列,会返回null
}

queue直接继承Collection,有6个基本方法实现增删查的功能

单向队列:

PS:删除的数据还是保存在内存中的,只是不能被访问,因为front位置移动了

上图中第二步,我们从队头front删除一些数据,然后队尾由于插入数据,rear移动到最后,此时无法插入数据

为了避免队列不满但是不能插入数据的情况,采用第三步:循环队列,将队尾回绕到队列开始的位置

Java代码实现单向队列:

public class MyQueue<E> {
private int maxSize; //队列总大小
private Object[] elementData; //保存数据的数组
private int front; //队头
private int rear; //队尾
private int nItems; //队列元素的数量 public MyQueue(int value) {
maxSize = value;
elementData = new Object[value];
front = 0;
rear = -1;
nItems = 0;
} public void add(E e) {
if (isFull()) {
System.out.println("当前队列已满");
} else {
if (rear == maxSize - 1) { //如果rear已经指向最后面,将队尾回绕到队列开始的位置
rear = -1;
}
elementData[++rear] = e; //rear后移一位(首位为0),并且插入数据
nItems++; //元素数量+1
}
} //移除数据
public E remove(){
E temp = null;
if (isEmpty()) {
System.out.println("当前为空队列,无法删除");
} else {
temp = (E)elementData[front++]; //返回队头front的数据,然后front后移一位
if (front == maxSize) { //如果front已经后移到最末尾了,front重置
front = 0;
}
nItems--; //元素数量-1
}
return temp;
} public E peek(){ //查看队头数据
return (E)elementData[front];
} public boolean isFull(){
return (nItems == maxSize);
} public boolean isEmpty(){
return (nItems ==0);
} public int getSize(){ //返回队列的大小
return nItems;
}
}
public static void main(String[] args) {
MyQueue<Integer> queue = new MyQueue<>(5);
int i = 0;
while (!queue.isFull()) {
queue.add(i++);
}
queue.add(6); //当前队列已满,无法添加了
while (!queue.isEmpty()) {
queue.remove();
}
}
输出结果:当前队列已满

优先级队列:

  优先级队列是比栈和队列更专用的数据结构,一般情况下,和浦东队列一样,优先级队列有一个头部和一个尾部,也是从头部移除数据。

不过优先级队列中,元素按照关键字是有序的。关键字最小的元素总是在头部,元素在插入的时候按照顺序插入到合适的位置以确保队列的顺序

  优先级队列在程序中也有很多应用,例如:图的最小生成树

  这里我们使用简单数组实现优先级队列,这种方式比较慢,但是很简单。优先级队列一般都是通过队来实现,在后面会降到

代码实现:

public class MyPriorityQueue  {

    private int maxSize;    //队列总大小
private Object[] elementData; //保存数据的数组
private int nItems; //队列元素的数量 public MyPriorityQueue(int value) {
maxSize = value;
elementData = new Object[value];
nItems = 0;
} public boolean add(int e) {  //添加元素,关键字小的元素在头部,通过插入排序实现
int j;
if (nItems == 0) {
elementData[nItems++] = e;
} else {
j = nItems - 1;
while (j >= 0 && e > (int)elementData[j]) {
elementData[j+1] = elementData[j];
j--;
}
elementData[j+1] = e;
nItems++;
}
return true;
} //移除数据
public Object remove(){  //删除一条数据,返回老数据
Object value = elementData[nItems-1];
elementData[nItems-1] = null;
nItems--;
return value;
} public Object peekMin() {  //返回优先级最高的元素
return elementData[nItems-1];
} //判断是否为空
public boolean isEmpty(){
return (nItems == 0);
} //判断是否满了
public boolean isFull(){
return (nItems == maxSize);
}
}
public static void main(String[] args) {
MyPriorityQueue queue = new MyPriorityQueue(5);
int i = 0;
while (!queue.isFull()) {
queue.add(i++);
}
while (!queue.isEmpty()) {
System.out.println(queue.peekMin());;
queue.remove();
}
}
打印结果:
0
1
2
3
4

add()通过插入排序实现,时间复杂度O(N),如果忘记插入排序,可以参考:Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序

PS:Queue一般作为程序的某种实现,而不是用来保存数据

内容参考:<Java数据结构和算法>

Java数据结构和算法(二)--队列的更多相关文章

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

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

  2. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  3. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  4. Java数据结构与算法(3):队列

    队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除. 队列模型 队列的基本操作包括入队.出队操作.在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO). 队列的数组实现 对于每一个 ...

  5. JavaScript数据结构与算法(二) 队列的实现

    TypeScript方式源码 class Queue { items = []; public enqueue(element) { this.items.push(element); } publi ...

  6. 1、java数据结构和算法---循环队列

    直接上代码: public class CircleArrayQueueLvcai { private int[] array; private int maxSize;//循环队列大小 privat ...

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

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

  8. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

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

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

随机推荐

  1. CMake学习记录--list(列表操作命令)

    CMake是一个跨平台的工程管理工具,能方便的把工程转换为vs各个版本.Borland Makefiles.MSSYS Makefiles.NMake Makefiles等工程,对于经常在不同IDE下 ...

  2. bzoj2384

    树状数组+KMP 匹配问题上KMP 但是问题在于如何判断两个位置相等,我们认为如果一个位置之前比他小的数数量相同那么就是相等. 那么我们用树状数组动态维护这个东西,每次跳nxt的时候用树状数组删除数. ...

  3. 【旧文章搬运】如何从EPROCESS辨别一个进程是否已退出

    原文发表于百度空间,2008-7-31========================================================================== 前面已经通过 ...

  4. thinkpad开机引导方式变成PCI LAN选项解决

    问题:开机的引导方式变成[PCI LAN],并且前面有一个小箭头,无法正常启动加载.在BIOS中重置调整启动顺序也无法解决.无法进入U盘启动盘 1.首先开机按F12进入BIOS,选择 APP Menu ...

  5. MFC类别概述

    MFC 类别主要可分为下列数大群组: ■ General Purpose classes - 提供字符串类别.数据处理类别(如数组与串行),异 常情况处理类别.文件类别...等等. ■ Windows ...

  6. Codeforces34C【尺取】

    题意: 输入一系列的数,连续数字则输出连续区间 看第一个案例就很明显 思路: 输入字符串输入,预处理一下. 写了个挫尺取- 贴一发挫code--. #include <bits/stdc++.h ...

  7. bzoj 4550: 小奇的博弈【博弈论+dp】

    首先看出终止状态是全都堆在左边或者右边,然后发现黑的向左白的向右是最优策略(如果不能这样了也就该输了) 然后就不会了 参考 http://www.cnblogs.com/CQzhangyu/p/770 ...

  8. LuoguP2657 [SCOI2009]windy数 【数位dp】By cellur925

    题目传送门 题目大意:在A和B之间,包括A和B,总共有多少个不含前导零且相邻两个数字之差至少为2的正整数? 显然是数位dp啦=w=. 显然与上一位有关,我们$dfs$的时候就要记录$pre$.因为这是 ...

  9. 阿里云服务器及部署mysql

    可通过百度获取内容不再赘述. 远程连接: 远程连接阿里云服务器需在服务器上开放443端口,方法自行百度 win10通过系统自带远程连接服务连接时需安装凭据:   http://blog.csdn.ne ...

  10. Linux下备份MySQL数据库的Shell脚本

    数据库每天都想备份,手动备份太麻烦而又容易忘记,所以写了一个自动备份MySQL数据库的脚本,加入定时计划中,每天自运运行. 创建Shell脚本代码如下,命名为mysql_dump.sh #!/bin/ ...