/**
* 循环队列
*/
class Queue {
private int maxSize;
private long[] queue;
private int front;
private int rear;
private int nItems; public Queue(int size) {
maxSize = size;
queue = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
} /**
* 插入value 运行的前提条件是队列不满。满的话抛出异常
*
* @param value
* @throws Exception
*/
public void insert(long value) throws Exception {
if (isFull()) {
throw new Exception("queue is full, can not insert " + value);
}
// 当rear指针指向数组的顶端,即maxSize-1位置时,在插入数据项之前,必须绕回到数组的底端。
// 回绕操作把rear设置为-1,因此当rear加1后为0,是数组底端的下标值
if (rear == maxSize - 1) {
rear = -1;
}
// 插入操作rear队尾指针加一后,在队尾指针所指的位置处插入新的数据。然后nItem++
queue[++rear] = value;
nItems++;
} /**
* 队头移除操作 前提是队列不空,为空则抛出异常
*
* @return
* @throws Exception
*/
public long remove() throws Exception {
if (isEmpty()) {
throw new Exception("queue is empty, can not remove");
}
// 移除操作总是由front指针得到队头数据项的值,然后将front加一。
long temp = queue[front++];
// 如果进行完毕后front的值超过数组的顶端,也就是==maxSize,front就必须绕回到0位置
if (front == maxSize)
front = 0;
// 操作完毕后,nItems减一
nItems--;
return temp;
} public long peekFront() {
return queue[front];
} public boolean isEmpty() {
return nItems == 0;
} public boolean isFull() {
return nItems == maxSize;
} public int size() {
return nItems;
}
} public class QueueDemo {
public static void main(String[] args) {
Queue q = new Queue(5);
try {
for (int i = 0; i < 7; i++) {
q.insert(i);
}
} catch (Exception e) {
System.out.println(e);
} try {
for (int i = 0; i < 7; i++) {
System.out.println("removed " + q.remove() + ", and queue size is: " + q.size());
}
} catch (Exception e) {
System.out.println(e);
} }
}

《Java数据结构与算法》笔记-CH4-4循环队列的更多相关文章

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

    简介 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插入操作的端称为 ...

  2. Java数据结构和算法(1)之队列

    1.队列的基本概念 队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...

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

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

  4. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

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

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

  6. Java数据结构和算法(九)——高级排序

    春晚好看吗?不存在的!!! 在Java数据结构和算法(三)——冒泡.选择.插入排序算法中我们介绍了三种简单的排序算法,它们的时间复杂度大O表示法都是O(N2),如果数据量少,我们还能忍受,但是数据量大 ...

  7. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  8. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  9. Java数据结构和算法 - 高级排序

    希尔排序 Q: 什么是希尔排序? A: 希尔排序因计算机科学家Donald L.Shell而得名,他在1959年发现了希尔排序算法. A: 希尔排序基于插入排序,但是增加了一个新的特性,大大地提高了插 ...

  10. Java数据结构和算法 - 递归

    三角数字 Q: 什么是三角数字? A: 据说一群在毕达哥拉斯领导下工作的古希腊的数学家,发现了在数学序列1,3,6,10,15,21,……中有一种奇特的联系.这个数列中的第N项是由第N-1项加N得到的 ...

随机推荐

  1. 如何获取supersocket的源代码

    源代码的地址:https://github.com/kerryjiang/SuperSocket 安装git之后,可以使用命令行git clone https://github.com/kerryji ...

  2. Android中GridView拖拽的效果【android进化三十六】

      最 近看到联想,摩托罗拉等,手机launcher中有个效果,进入mainmenu后,里面的应用程序的图标可以拖来拖去,所以我也参照网上给的代码,写了 一个例子.还是很有趣的,实现的流畅度没有人家的 ...

  3. Qt之Tab键切换焦点顺序

    简介 Qt的窗口部件按用户的习惯来处理键盘焦点.也就是说,其出发点是用户的焦点能定向到任何一个窗口,或者窗口中任何一个部件. 焦点获取方式比较多,例如:鼠标点击.Tab键切换.快捷键.鼠标滚轮等. 习 ...

  4. 51nod1158 全是1的最大子矩阵

    跟最大子矩阵差不多O(n3)扫一下.有更优写法?挖坑! #include<cstdio> #include<cstring> #include<cctype> #i ...

  5. ubuntu 12.04上安装OpenERP 7的一次记录

    登陆ssh, 先更新系统: sudo apt-get update && sudo apt-get dist-upgrade 接着再为openerp运行创建一个系统用户,用户名就叫op ...

  6. iPad中控制器view的width和height

    一.iPad中控制器view的width和height 1> 规律 * width 是宽高中最小的那个值 * height 是宽高中最大的那个值 2> 举例(比如窗口根控制器的view,有 ...

  7. dede 首页调用单页->栏目内容

    {dede:sql sql='Select content from dede_arctype where id=47'} [field:content/] {/dede:sql}

  8. 函数式宏定义用do...while(0)的好处

    函数式宏定义经常写成这样:<pre lang="c" escaped="true">#define device_init_wakeup(dev, ...

  9. Heritrix源码分析(九) Heritrix的二次抓取以及如何让Heritrix抓取你不想抓取的URL

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/644396       本博客已迁移到本人独立博客: http://www.yun5u ...

  10. 浅谈C#浅拷贝和深拷贝

    近来爱上一本书<编写高质量代码,改善C#程序的157个建议>,我想很多人都想编写高质量的代码,因为我们不仅仅是码农,更是一名程序员. 从今天开始,我将每天和大家分享这本书中的内容,并加上自 ...