[数据结构]P1.2 队列
* 注: 本文/本系列谢绝转载,如有转载,本人有权利追究相应责任。 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 队列的更多相关文章
- C语言数据结构-链式队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-链式队列的实现-C语言 typedef struct QNode { int data; struct QNode *next; }QNode,*QueuePtr; typedef st ...
- javascript数据结构与算法---队列
javascript数据结构与算法---队列 队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素.队列用于存储按顺序排列的数据,先进先出,这点和栈不一样(后入先出).在栈中,最后入栈的元素 ...
- C++数据结构之链式队列(Linked Queue)
C++数据结构之链式队列,实现的基本思想和链式栈的实现差不多,比较不同的一点也是需要注意的一点是,链式队列的指向指针有两个,一个是队头指针(front),一个是队尾指针(rear),注意指针的指向是从 ...
- [数据结构]C语言队列的实现
我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...
- JavaScript数据结构和算法----队列
前言 队列和栈很像,只是用了不同的原则.队列是遵循先进先出(FIFO)原则的一组有序的的项,队列在尾部添加新元素,从顶部移除元素.最新添加的元素必须必须排队在队列的,末尾.可以想象食堂排队买饭的样子. ...
- JavaScript数据结构与算法-队列练习
队列的实现 // 队列类 function Deque () { this.dataStore = []; this.enqueueFront = enqueueFront; this.enqueue ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- C语言- 基础数据结构和算法 - 队列的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- python数据结构与算法——队列
队列结构可以使用数组来模拟,只需要设定头和尾的两个标记 参考自<啊哈> # 按书中的代码会出现索引越界的问题(书中申请了超量的空间) # 尝试令tai初始为len(q)-1则不会出错但少了 ...
随机推荐
- VMware Workstation下ubuntu虚拟机无法上网连不上网络解决
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- 转:sql篇 select from where group by having order by
原文地址: sql篇 select from where group by having order by select from where group by having order by 的基 ...
- java异常处理解决方案
一.异常概念 Throwable类是Java中所有错误或异常的超类. 1.只有当对象是此类(或其子类)的实例时,才能通过Java虚拟机或着Java throw语句抛出. 2.只有此类或其子类才 ...
- webpack的externals的使用
externals 官网文档解释的很清楚,就是webpack可以不处理应用的某些依赖库,使用externals配置后,依旧可以在代码中通过CMD.AMD或者window/global全局的方式访问. ...
- CookieUitl
import javax.servlet.http.Cookie;import javax.servlet.http.HttpServletRequest;import javax.servlet.h ...
- 好的封装 vs 好的复用
好的封装 vs 好的复用好的封装 一个封装相对较好的体现和实现方式如下:内部类的方式来组织代码,不需要外面的类指导我内部的类. 好的复用一个好的复用的体现和实现方式如下:可以通过搭积木的方式来组织功能 ...
- git pull 冲突拉取不到新的代码
本地文件已经有冲突或者在pull的过程中拉取的文件和本地文件冲突时,拉取不到新的代码,git pull出现报错,如下: 这个时候,如果你有两种选择,如果你需要这些改动,那个你就需要手动解决冲突,然后a ...
- Linux应用之crontab定时任务的设置
实现Linux定时任务有:cron.anacron.at等,这里主要介绍cron服务. 名词解释: cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表. 软件包安装: 要使 ...
- Parallels Desktop 重装系统
安装教程,大家可以在网上找找 现在我想重装系统,怎么弄呢? 1.~/Documents/Parallels 目录下那个PVM后缀的文件直接删除 2.重装找开虚拟机,会弹出一个框,说找不到系统,点击删除 ...
- centos7安装redist 以及redis扩展
wget http://download.redis.io/releases/redis-3.2.1.tar.gz 用wget下载 $ tar xzf redis-3.2.1.tar.gz 解 ...