1、队列的定义

队列(queue):是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

队列是一种先进先出的线性表,简称FIFO(First out firts in)。允许插入的一头是队尾,允许删除的一头是队头。

注意:

队列是线性表,也同样有类似线性表的各种操作,不同的就是插入数据只能在队尾进行,删除数据只能在队头进行。

2、循环队列

2.1 循环队列的定义

队列中front指针指向队头元素,rear指针指向队尾元素的下一个元素,这样当front==rear 时,此队列是空队列。

循环队列的定义是:队列头尾相接的顺序存储结构称为循环队列。

队列满的条件是:(rear+1)%Queuesize = front;

通用的计算队列长度的公式为:(rear-front+Queuesize)%Queue

2.2 队列的顺序存储

队列插入元素主要步骤:rear = (rear+1)%Queuesize;

队列删除元素主要步骤:front = (front+1)%Queuesize;

队列的顺序存储代码实现:

public class SqeQueue<E> {
ArrayList<E> queue = new ArrayList<E>(); final int MAXSIZE = 20;//循环队列的长度
int font;//对头
int rear;//队尾
/*
* 队列构造函数
*/
public SqeQueue(){
initQueue();
}
/*
* 队列初始化
*/
public void initQueue(){
font=0;
rear=0;
}
/*
* 队列的当前长度
*/
public int getLength(){
return (rear-font+1)%MAXSIZE;
}
/*
* 入队,队是在队尾入队
*/
public boolean addQueue(E e){
//队列满的判断
if((rear+1)%MAXSIZE == font){
System.out.println("队满");
}
//将e赋给队尾
queue.add(rear, e);
//rear 后移一位
rear =( rear+1) %MAXSIZE;
return true;
}
public E deleteQueue(){
//队列满的判断
if(font == rear){
System.out.println("队为空");
}
//队头元素赋值给e
E e = queue.get(font);
//对头后移一位
font = (font+1)%MAXSIZE;
return e;
} public static void main(String args[]){
SqeQueue<Object> sqeQueue = new SqeQueue<Object>();
sqeQueue.addQueue("zzzzz");
sqeQueue.addQueue("bbbbbb");
sqeQueue.addQueue("333333");
for(int i=0;i<=sqeQueue.getLength();i++){
System.out.println(sqeQueue.deleteQueue());
}
}
}

3、队列的链式存储结构及实现

队列的链式存储结构,其实就是线性表的单链表,只不过它是尾进头出,我们把它简称为链队列。

队头指针指向链队列的头结点,队尾指针指向终端结点。

空队列时,front和rear都指向头结点。

入队操作时,其实就是在链表尾部插入结点。

出队操作时,其实就是头结点的后继结点出队,将头结点的后继改为它后面的结点,若链表除头结点外只剩一个元素,则需要将rear指向头结点。

package com.aclie.dataStructe4.queue;

public class LinkQueue {
Node2 rear;//队尾
Node2 front;//队头
int count=0;
/*
* 无参构造函数,初始化链表
*/
public LinkQueue(){
rear = front = null;
}
/*
* 有参构造函数,初始化链表
*/
public LinkQueue(Object obj){
front = new Node2(obj);
rear = front;
count++;
}
/*
* 得到链表的当前长度
*/
public int getLinkLength(){
return count;
}
/*
* 入队,在队尾插入元素
*/
public void addLinkQueue(Object obj){ if(front == null){//空队列,插入元素
front = new Node2(obj);
rear = front;
}else{//非空队列
Node2 p = new Node2(obj);//要插入的结点
rear.next2 = p;//将插入结点赋值给rear后继
rear = p;//更改rear,rear指向插入的结点 }
count++;
}
public Object deleteLinkQueue(Object obj){
if(rear == front){
System.out.println("参数错误");
}
Node2 s =front;//将要删除的结点暂存为结点s
Object data2= s.data;//获取要删除的元素
front = s.next2;//将原队头结点后继s.next2 赋值给头结点后继
if(rear == s){//若队头是队尾,则将删除后将rear指向队头
rear = front;
}
s.next2 = null;//释放要删除结点
count--;
return data2;//返回删除
} public void printLinkQueue(){
if(front == null){
System.out.println("无打印的参数");
}else{
Node2 cur = front;
while(cur != null){
System.out.println(cur.data);
cur = cur.next2;
}
} }
public static void main(String args[]){
LinkQueue linkQueue = new LinkQueue();
linkQueue.addLinkQueue("222214"); linkQueue.addLinkQueue("ewqtee"); linkQueue.addLinkQueue("35432654"); linkQueue.printLinkQueue();
System.out.println("...........");
linkQueue.deleteLinkQueue(linkQueue.front);
linkQueue.deleteLinkQueue(linkQueue.front);
linkQueue.deleteLinkQueue(linkQueue.front);
linkQueue.printLinkQueue(); }
}
class Node2{
Object data;//数字域
Node2 next2;//指针域
public Node2(Object d2){
this.data = d2;
}
}

4、总结

对应循环队列与链队列的比较,可以从以下两方面:

时间上:其实他们都是基本的常数时间,即O(1),不过循环队列是事先申请好的空间,使用期间不释放,而对于链队列,每次申请和释放存在一些时间开销,

如果入队出队频繁,则两者还是有细微差异的。

空间上:循环队列必须有一个固定的长度,这就造成了存储元素个数和空间上的浪费。而链队列不存在这个问题。尽管它需要一个指针域,会产生一些空间上的开销,但也可以接              受。所以空间上,链队列更加灵活。

总得来说,在可以确定队列长度最大值情况下,建议用循环队列,如果无法预估队列长度,则用链队列。

大话数据结构(十)java程序——队列的更多相关文章

  1. Java程序员进击书籍推荐

    计算机基础 计算机科学导论 计算机操作系统 操作系统原理及应用(Linux) Java 基础和进阶 疯狂Java讲义 Java 核心基础卷1/2 Java编程思想 Java 8实战 jls11 Eff ...

  2. Java程序员从笨鸟到菜鸟全部博客目录

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 大学上了一年半,接触java也一年半了,虽然中间也有其他东西的学习,但是还是以java为主 ...

  3. 《Java程序员由笨鸟到菜鸟》

    <Java程序员由笨鸟到菜鸟> 在众多朋友的支持和鼓励下,<Java程序员由菜鸟到笨鸟>电子版终于和大家见面了.本电子书涵盖了从java基础到javaweb开放框架的大部分内容 ...

  4. 【Java】 大话数据结构(7) 循环队列和链队列

    本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...

  5. 大话数据结构(八)Java程序——双向链表的实现

    线性链表--双向链表 双向链表定义: 双向链表(double linked list): 是在单表单的每个结点中,再设置一个指向前驱结点的指针域.因此,在双向链表中的结点都有两个指针域,一个指向前驱, ...

  6. 【Java】 大话数据结构(1) 线性表之顺序存储结构

     本文根据<大话数据结构>一书,实现了Java版的顺序存储结构. 顺序存储结构指的是用一段地址连续的存储单元一次存储线性表的数据元素,一般用一维数组来实现. 书中的线性表抽象数据类型定义如 ...

  7. 【Java】 大话数据结构(2) 线性表之单链表

    本文根据<大话数据结构>一书,实现了Java版的单链表. 每个结点中只包含一个指针域的链表,称为单链表. 单链表的结构如图所示: 单链表与顺序存储结构的对比: 实现程序: package ...

  8. 【Java】 大话数据结构(3) 线性表之静态链表

    本文根据<大话数据结构>一书,实现了Java版的静态链表. 用数组描述的链表,称为静态链表. 数组元素由两个数据域data和cur组成:data存放数据元素:cur相当于单链表中的next ...

  9. 【Java】 大话数据结构(5) 线性表之双向链表

    本文根据<大话数据结构>一书,实现了Java版的双向链表. 在每个数据结点中都有两个指针,分别指向直接后继和直接前驱,这样的链表称为双向链表. 双向链表的结构如图所示: 查找元素可以根据元 ...

随机推荐

  1. 【codevs1993】草地排水 最大流

    [codevs1993]草地排水 题目描述 Description 在农夫约翰的农场上,每逢下雨,Bessie最喜欢的三叶草地就积聚了一潭水.这意味着草地被水淹没了,并且小草要继续生长还要花相当长一段 ...

  2. Hark的数据结构与算法练习之鸡尾酒排序

    算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...

  3. 源码安装Memcached服务器及其2种PHP客户端

    本文所用源码包皆为当时最新stable稳定版. 安装memcached服务器 先安装libevent, 最新版为2.0.21 tar -zxvf libevent-2.0.21-stable.tar. ...

  4. linux中使用top获取进程的资源占用信息

    在linux中使用top获取进程的资源占用信息: Cpu(s):  1.0%us,  0.0%sy,  0.0%ni, 98.3%id,  0.7%wa,  0.0%hi,  0.0%si,  0.0 ...

  5. Redis String命令

        命令 解释 APPEND key value 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾. 如果 key 不存在, APPEND ...

  6. ZOJ 3910 Market ZOJ Monthly, October 2015 - H

    Market Time Limit: 2 Seconds      Memory Limit: 65536 KB There's a fruit market in Byteland. The sal ...

  7. Task<TResult> 类

    https://msdn.microsoft.com/zh-cn/library/dd321424.aspx

  8. WebConfig配置文件详解(转载自逆心的博客)

    <?xml version="1.0"?> <!--注意: 除了手动编辑此文件以外,您还可以使用 Web 管理工具来配置应用程序的设置.可以使用 Visual S ...

  9. Java虚拟机(JVM)中的内存设置详解

    在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步. PermGen space:全称是Permanent Generation ...

  10. jQuery.qrcode.js客户端生成二维码,支持中文并且可以生成LOGO

    描述: jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生成二维条码.此插件是能够独立使用的,体积也比较         ...