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("队为空");}//队头元素赋值给eE 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;//将要删除的结点暂存为结点sObject 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),不过循环队列是事先申请好的空间,使用期间不释放,而对于链队列,每次申请和释放存在一些时间开销,

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

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

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

转载于:https://www.cnblogs.com/snowwang/p/6083783.html

大话数据结构(十)java程序——队列相关推荐

  1. 大话数据结构及JAVA数据结构阅读笔记

    目录 一.大话数据结构随书阅读笔记 第一章 数据结构概述 第二章  算法概述 第三章 线性表 第四章 栈与队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序 二.大话数据结构思维导图 ...

  2. 《大话数据结构》Java实现 顺序存储的插入与删除

        欢迎大家关注我的公众号,有问题可以及时和我交流. 前言 <大话数据结构>这本书使用的是C语言编写,为了练习书上举的例子,使用Java按照作者的思想进行模拟出来. 也许我这里不是最好 ...

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

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...

  4. Java程序员由笨鸟到菜鸟 电子版书正式发布 欢迎大家下载

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 欢迎关注 ...

  5. 《大话数据结构》3、4、5线性表、栈与队列、串

    第3章线性表 41 线性表:零个或多个数据元素的有限序列. 3.1开场白 42 门外家长都挤在大门口与门里的小孩子的井然有序,形成了鲜明对比.哎,有时大人的所作所为,其实还不如孩子. 3.2线性表的定 ...

  6. 《大话数据结构》读书笔记-栈与队列

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书. 文章目录 4.2栈的定义 4.2.1 栈的定义 4.2.2 进栈出栈变 ...

  7. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

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

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

  9. 大话数据结构-栈与队列

    文章知识点来至于大话数据结构里边章节知识, 这篇主要介绍栈与队列在计算机中存储形式, 以及在某些算法领域中对栈和队列的相关应用.章节最后介绍了著名的逆波兰表达式, 以及通过算法来实现该表达式的运算过程 ...

最新文章

  1. 打包可执行包_想把你写的Python程序发给别人用?打包成exe啊!
  2. golang mysql自动重连_rabbitmq消费者插入mysql数据并实现断线自动重连
  3. vs2017 不能加载.vdproj
  4. matlab三维feather,matlab高维图形,别地方抄来的
  5. 面向 Java 开发人员的 Scala 指南: 深入了解 Scala 并发性
  6. 海棠读社小程序研发(.Net Core版)
  7. 垃圾收集算法,垃圾收集器_为什么我不能关闭垃圾收集器?
  8. eclipse中tomcat能正常启动,在浏览器中不能打开问题
  9. html实现页面弹球,使用html+css+js实现弹球游戏
  10. 关于并查集的Python实现代码
  11. Linux之判断socket是否断开
  12. 4线电子围栏安装示意图_红外对射、电子围栏、振动光纤、智能警戒4种常用的周界安防系统...
  13. shiro.crypto.CryptoException: Unable to correctly extract the Initialization Vector or ciphertext
  14. lisp语言1y1c,常青树LISP语言
  15. Python守护进程daemon实现
  16. python groupy分组
  17. 博客神器-markdown
  18. poco mysql 安装_CentOS7上安装POCO
  19. 获取33中生活指数数据
  20. java日期时间库-常用案例-不保留全分享

热门文章

  1. python 面向对象_Python新手入门【面向对象】
  2. html设置box设置长度自适应,CSS实现宽度自适应宽高16:9的矩形的示例
  3. 简单尝试 express 使用 websocket
  4. Java 抖音授权登录
  5. (5.1) Tomcat 8 源码, 实例化组件
  6. 企业网络推广浅析外包企业网络推广如何有效布局关键词优化?
  7. 网站SEO优化的高效手段有哪些?
  8. 新网站优化基本流程不可忽视!
  9. 使用c++ 实现定时触发键盘事件_基于定时器捕获测量脉宽的应用示例
  10. mongodb 关闭服务 mongod -f /root/mongodb/bin/xx.conf --shutdown