* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任。 2019年4月8日

Stan Zhang 2019年4月8日  格物致知,经世致用。

队列是一种先进先出FIFO的模型,常见操作有: push、pull 获得队列出口首元素并从队列中删除、peek 查看队列出口首元素,不从队列中删除。

队列与其他线性结构一样,可以使用数组或者链表实现,这里使用数组实现。

使用数组实现队列长度必然是固定的,因此规定当队列存满之后不再进行扩容,只是提示。

队列中为了充分使用数据空间,首尾指针采用与数组长度求模的方式进行添加和删除。

Java代码:

package ds2.queue;

public class ArrayQueue {
static class Queue{
int maxSize;
int queSize;
long[] data ;
int head; // 头索引
int tail; // 尾索引
public Queue(int maxSize) {
this.maxSize = maxSize;
this.data = new long[maxSize];
this.head = 0;
this.tail = -1;
} public boolean isFull(){
return maxSize == queSize;
} public boolean isEmpty(){
return queSize == 0;
} /**
* 向尾部加数据
* 线性时间
* @param data
*/
public void push(long data){
if(isFull()){
System.out.println("The element cann't be inserted owing to the queue is full!");
}else{
this.tail = (this.tail + 1)%this.data.length;
this.data[this.tail] = data;
this.queSize ++ ;
}
} /**
* 从头部取数据,线性时间
* @return
*/
public long peek(){
return this.data[this.head];
} /**
* 从头部取数据
* @return
*/
public long pull(){
long data = this.data[this.head];
this.head = (this.head + 1)%this.data.length;
this.queSize --;
return data;
} public void foreachPrint(){
if(this.isEmpty()){
System.out.println("[]");
return;
}
System.out.print("[" + this.data[this.head]);
for(int i = 1,j = this.head + 1; i < queSize; i++,j++){
System.out.print("," + this.data[j%this.data.length]);
}
System.out.println("]");
} } public static void main(String[] args) {
Queue queue = new Queue(4);
queue.push(1);
queue.foreachPrint();
queue.push(2);
queue.foreachPrint();
queue.push(3);
queue.foreachPrint();
queue.push(4);
queue.foreachPrint();
queue.push(5);
queue.foreachPrint();
System.out.println(queue.peek());
queue.foreachPrint();
System.out.println(queue.pull());
queue.foreachPrint();
System.out.println(queue.pull());
queue.foreachPrint();
queue.push(5);
queue.foreachPrint();
queue.push(6);
queue.foreachPrint();
}
}

result::

[1]
[1,2]
[1,2,3]
[1,2,3,4]
The element cann't be inserted owing to the queue is full!
[1,2,3,4]
1
[1,2,3,4]
1
[2,3,4]
2
[3,4]
[3,4,5]
[3,4,5,6]

[数据结构]P1.2 队列的更多相关文章

  1. C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作

    1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...

  2. javascript数据结构与算法---队列

    javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...

  3. C++数据结构之链式队列(Linked Queue)

    C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...

  4. [数据结构]C语言队列的实现

    我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...

  5. JavaScript数据结构和算法----队列

    前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...

  6. JavaScript数据结构与算法-队列练习

    队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...

  7. 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列

    栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...

  8. C语言- 基础数据结构和算法 - 队列的顺序存储

    听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...

  9. python数据结构与算法——队列

    队列结构可以使用数组来模拟,只需要设定头和尾的两个标记 参考自<啊哈> # 按书中的代码会出现索引越界的问题(书中申请了超量的空间) # 尝试令tai初始为len(q)-1则不会出错但少了 ...

随机推荐

  1. IE浏览器Web自动化

    一.常见问题 1.1  在IE11浏览器下运行自动化脚本特别缓慢. 具体表现:(64位IE驱动器下)脚本运行慢,尤其是文本框输入,其它浏览器是一起输入,但IE是单个字节输入字符串 解决方法:更换IE的 ...

  2. PTA 树的遍历

    给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列.这里假设键值都是互不相等的正整数. 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数.第二行给出其后序遍历序列.第三 ...

  3. xutils android studio引用问题

    然后rebuild--->关闭项目-->重启,ok public class MyApplication extends Application { @Override public vo ...

  4. Cutterman - 最好用的切图工具

    Cutterman - 最好用的切图工具 http://www.cutterman.cn/zh/cutterman

  5. cpu概念

    cpu的主频=外频x倍频 cpu的主频不能完全决定cpu的性能,只是cpu性能的一个参数 cpu的外频是cpu的基准频率,它决定着整个主板的运行速度,超频超的是cpu的外频 IPC:cpu每一个时钟周 ...

  6. python之requests模块快速上手

    安装 pip3 install requests 使用 发送请求 import requests r = requests.get('http://www.baidu.com') 还可以如下方式发送不 ...

  7. 原生侧边栏sidebar

    创建侧栏导航 html: <a href="#" class="btn">点我啊</a> <div class="sid ...

  8. Oracle中如何使用REGEXP_SUBSTR函数动态截取字符串

    REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)__srcstr ...

  9. C#-----中使用using详解

    1.using指令 using + 命名空间名字 例:using System;        using System.Data; 2.using语句 定义一个范围,在范围结束时处理对象,出了这个范 ...

  10. Kubernetes持久化存储1——示例

    目录贴:Kubernetes学习系列 一.简介 存储管理与计算管理是两个不同的问题.Persistent Volume子系统,对存储的供应和使用做了抽象,以API形式提供给管理员和用户使用.要完成这一 ...