第四章涉及三种数据存储类型:栈,队列,优先级队列

1.概括:他们比数组和其他数据存储结构更为抽象,主要通过接口对栈,队列和优先级队列进行定义。这些

接口表明通过他们可以完成的操作,而他们的主要实现机制对用户来说是不可见的。(比如栈可以使用数组实现,也可以使用链表实现)

2.栈:

先进后出。

数据项进栈和入栈的时间复杂度都是O(1),也就是说栈操作所消耗的时间不依赖于数据项的个数,因此栈操作时间短。栈操作不需要比较和移动操作。

3.队列:

先进先出。例如:银行排队办业务,飞机等待起飞,网络数据包等待传送。。。

操作系统中各种队列:打印机作业在打印队列中等待打印;键盘敲击时,存储键入内容的队列;。。

*insert:把一个元素放入队尾

*remove:移除队头的元素。

栈中的push和pop命名很标准,队列的方法至今没有标准化的命名。insert(put,add,enque); remove(delete, get,deque)等

问题:

往队列中插入一个新元素,队头的rear箭头向上移动,移向数组下标大的位置。移除元素时,队尾Front指针也会向上移动。

这种情况和人们直觉相反,因为排队买票的时候,队伍总是向前移动的,当前面的人买完票离开队伍后,其他人都向前移动。

计算机中在队列里删除一个数据项后,也可以将其他数据项都向前移动,但是这样效率很差。

相反,通过队列中队头和队尾指针的移动保持所有的数据项的位置不变。

这样设计的问题是,队尾指针很快就会移动到数组的末端。,队尾指针不能再向后移动,无法移除也不能插入。

解决:循环队列,有时也称缓冲环。

在队列中插入足够多的数据项,队尾指针移动到高下标,再删除几个队头的数据项,再插入的时候,对为指针回绕到下标0;

在删除足够多数据项后,队头指针也回绕。

--->:没有数据项计数字段的队列:

在循环队列中nItems是计数字段,它的存在会使得insert和remove方法增加一点额外的操作,因为insert和remove方法必须分别递增

或者递减这个变量值。这可能算不上额外的开销,但是如果处理大量的插入和移除操作,就会影响性能。因此一些队列的实现不使用计数字段。

而是通过front和rear来计算出队列是否为空或者满以及数据项的个数。数据项的序列或者被折成两段,或者是连续的一段。

而且也出现一个问题:当队列满地时候,front和rear指针取一定的位置,但是当队列为空时,也可能呈现相同的位置关系。于是,在同一时间,

队列可能满也可能空。

--->:解决:让数组容量比队列数据项个数的最大值大一。

/**
* 不带计数字段的循环队列
*/
class QueueNoCount {
private int maxSize;
private long[] queue;
private int front, rear; public QueueNoCount(int size) {
maxSize = size + 1;
queue = new long[maxSize];
front = 0;
rear = -1;
} public void insert(long value) throws Exception {
if (isFull()) {
throw new Exception("queue is full, can not insert " + value);
}
if (rear == maxSize - 1)
rear = -1;
queue[++rear] = value;
} public long remove() throws Exception {
if (isEmpty()) {
throw new Exception("queue is empty, can not remove");
}
long temp = queue[front++];
if (front == maxSize)
front = 0;
return temp;
} public long peek() {
return queue[front];
} public boolean isEmpty() {
return (rear + 1 == front) || (front + maxSize - 1 == rear);
} public boolean isFull() {
return (rear + 2 == front) || (front + maxSize - 2 == rear);
} public int size() {
if(isEmpty()) return 0;
if(isFull()) return maxSize-1;
if (rear >= front)
return rear - front + 1;
return (maxSize - front) + (rear + 1);
}
} public class QueueNoCountDemo {
public static void main(String[] args) {
QueueNoCount q= new QueueNoCount(5);
try{
for(int i=1;i<7;i++){
q.insert(i);
System.out.println(i+"入队"+".对列中元素个数:"+q.size());
}
}catch(Exception e){
System.out.println(e);
}
try{
for(int i=1;i<7;i++){
System.out.println(q.remove()+"出队"+".对列中元素个数:"+q.size());
}
}catch(Exception e){
System.out.println(e);
}
System.out.println(q.size());
}
}

《Java数据结构与算法》笔记-CH4-5不带计数字段的循环队列的更多相关文章

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

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

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

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

  3. java数据结构和算法06(红黑树)

    这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...

  4. Java数据结构和算法

    首先,本人自学java,但是只学习了java的基础知识,所以想接下来学习一下数据结构和算法,但是找了很多教材,大部分写的好的都是用c语言实现的,虽然知道数据结构和算法,跟什么语言实现的没有关系,但是我 ...

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

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

  6. Java数据结构和算法(十四)——堆

    在Java数据结构和算法(五)——队列中我们介绍了优先级队列,优先级队列是一种抽象数据类型(ADT),它提供了删除最大(或最小)关键字值的数据项的方法,插入数据项的方法,优先级队列可以用有序数组来实现 ...

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

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

  8. java数据结构与算法之栈(Stack)设计与实现

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

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

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

随机推荐

  1. YTU 2609: A改错题--学生信息的输入和输出

    2609: A改错题--学生信息的输入和输出 时间限制: 1 Sec  内存限制: 128 MB 提交: 238  解决: 157 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方 ...

  2. 第三篇 从EXCEL电子表格到数据库

    一个靠EXCEL电子表格处理各部门业务数据的公司和一个使用一个统一的数据库存储各个部门用到的业务数据并提供大量权限不同的使用界面给用户的公司两者有什么不同呢?   EXCEL电子表格是数据和操纵数据的 ...

  3. HDU 2084 数塔

    没什么好说的,这是我学DP的第一道题目. //#define LOCAL #include <iostream> #include <cstdio> #include < ...

  4. 51nod1175 区间中第K大的数

    裸的主席树. #include<cstdio> #include<cstring> #include<cctype> #include<algorithm&g ...

  5. Intellij IDEA13 创建多模块Maven项目

    目标:构建一个类似于如下图所示的这种结构的Maven项目. 首先,需要选中“File”——>“New Project”如下图所示 选中“Maven”,设置项目名称与项目构建地址,点击“Next” ...

  6. 如何在不同编程语言中获取现在的Unix时间戳(Unix timestamp)?

    Java time JavaScript Math.round(new Date().getTime()/1000) 之所以除以1000是因为getTime()返回数值的单位是毫秒 Microsoft ...

  7. mac下编译optool方法

    参考地址:http://www.mopsled.com/2016/build-optool-osx/ 1.git clone https://github.com/alexzielenski/opto ...

  8. 部署在IIS服务器的asp.net 网站,禁止访问指定类型文件

    网站上的一些文件不希望用户访问,可以通过下面的方式简单实现.不需写代码(在IIS6下试验过). 第一步,在IIS中实现映射. 哪些文件需要特殊处理. 通俗的将就是将哪种类型的文件交给特定的工厂来处理. ...

  9. phonegap 清空页面缓存

    访问页面添加 <meta HTTP-EQUIV="pragma" CONTENT="no-cache"> <meta HTTP-EQUIV=& ...

  10. Linux/Unix shell 监控Oracle监听器(monitor listener)

    使用shell脚本实现对Oracle数据库的监控与管理将大大简化DBA的工作负担,如常见的对实例的监控,监听的监控,告警日志的监控,以及数据库的备份,AWR report的自动邮件等.本文给出Linu ...