java数据结构之自定义队列
一、队列的特点
1、队列是线性结构
2、先进先出,先进入队列的排在队列前端,会比后进队列的先出队列。FIFO
二、通过数组来实现队列
//自己实现数组队列,队列的特定就是先进先出
public class MyArrayQueue<E> { //用数组来保存
private Object[] queue; //队列容量
private int capacity; //队列中元素的个数
private int size; //队列头部元素对应的下标
private int head; //队列的尾部的下一个位置下标
private int tail; public MyArrayQueue(int capacity){
this.capacity = capacity;
this.queue = new Object[capacity];
} //将元素加入到队列的队尾,如果队列空间不足,抛出异常
public boolean add(E e) throws Exception{
//先确定空间是否足够,已经满了就抛出异常
if(size == capacity){
throw new Exception("queue full");
}
//没满就加入到队尾
queue[tail] = e;
//计算新的队尾
tail = (tail+1) % capacity;
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,抛出异常
public E remove() throws NoSuchElementException{
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E removed = elementData(head);
//将头部元素设置为null
queue[head] = null;
//重新计算head的值
head = (head+1) % capacity;
size -- ;
return removed;
} //将元素加入到队尾,如果队列已经满了,返回false
public boolean offer(E e){
//先确定空间是否足够,已经满了就返回false
if(size == capacity){
return false;
}
//没满就加入到队尾
queue[tail] = e;
//计算新的队尾
tail = (tail+1) % capacity;
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,返回null
public E poll(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E removed = elementData(head);
//将头部元素设置为null
queue[head] = null;
//重新计算head的值
head = (head+1) % capacity;
size -- ;
return removed;
} //返回队列头部的元素,如果队列为空,抛出异常
public E element(){
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = elementData(head);
return e;
} //返回队列头部的元素,如果队列为空,返回null
public E peek(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = elementData(head);
return e;
} @SuppressWarnings("unchecked")
private E elementData(int index) {
return (E) queue[index];
} }
三、通过链表来实现队列
//使用链表来实现队列
public class MyLinkedQueue<E> { //节点,保存元素信息,通过next指向下一个节点,形成单链表
private static class Node<E>{
E item;
Node<E> next;//下一个节点 Node(E e, Node<E> next){
this.item = e;
this.next = next;
}
}
//容量
private int capacity;
//元素个数
private int size;
//头节点
private Node<E> head;
//尾节点
private Node<E> tail; //构造函数
public MyLinkedQueue(int capacity){
this.capacity = capacity;
} //将元素加入到队列的队尾,如果队列空间不足,抛出异常
public boolean add(E e) throws Exception{
//先确定空间是否足够,已经满了就抛出异常
if(size == capacity){
throw new Exception("queue full");
}
//创建一个新的节点,然后添加到队列尾部
Node<E> node = new Node<E>(e,null);
if(size == 0){//如果队列为空
head = tail = node;
}else{//如果队列中已经有节点了
tail.next = node;
tail = node;
}
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,抛出异常
public E remove() throws NoSuchElementException{
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = head.item;
head.item = null; //方便GC
//将head指向下一个节点
head = head.next;
if(head == null){//删除后队列为空,头节点和尾节点都为null
tail = null;
}
size -- ;
return e ;
} //将元素加入到队尾,如果队列已经满了,返回false
public boolean offer(E e){
//先确定空间是否足够,已经满了就返回false
if(size == capacity){
return false;
}
//创建一个新的节点,然后添加到队列尾部
Node<E> node = new Node<E>(e,null);
if(size == 0){//如果队列为空
head = tail = node;
}else{//如果队列中已经有节点了
tail.next = node;
tail = node;
}
size ++;
return true;
} //返回并删除队列头部的元素,如果队列为空,返回null
public E poll(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = head.item;
head.item = null; //方便GC
//将head指向下一个节点
head = head.next;
if(head == null){//删除后队列为空,头节点和尾节点都为null
tail = null;
}
size -- ;
return e ;
} //返回队列头部的元素,如果队列为空,抛出异常
public E element(){
//判断是否为空,为空则报错
if(size == 0){
throw new NoSuchElementException();
}
E e = head.item;
return e;
} //返回队列头部的元素,如果队列为空,返回null
public E peek(){
//判断是否为空,为空则返回null
if(size == 0){
return null;
}
E e = head.item ;
return e;
} }
java数据结构之自定义队列的更多相关文章
- Java数据结构——双端队列
双端队列(Deque)双端队列是指允许两端都可以进行入队和出队操作的队列,其元素的逻辑结构仍是线性结构.将队列的两端分别称为前端和后端,两端都可以入队和出队.Deque继承自Queue接口,Deque ...
- java 数据结构与算法---队列
原理来自百度百科 一.队列的定义 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表.进行插 ...
- java数据结构-10循环队列
一.概念: 循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用 二.代码实现: @SuppressWarnings("unchecked" ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- java 数据结构 队列的实现
java 数据结构队列的代码实现,可以简单的进行入队列和出队列的操作 /** * java数据结构之队列的实现 * 2016/4/27 **/ package cn.Link; import java ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- 【Java】 大话数据结构(7) 循环队列和链队列
本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
随机推荐
- SCU 4442 party 二分图最大点权独立集
每个青蛙喝黑茶或者红茶或者都可以喝 M个矛盾关系 有矛盾的不能喝同种茶 但你可以花费Wi使得这个青蛙消除所有矛盾 把矛盾当作边 青蛙当作点 如果这两个青蛙只喝不同的一种茶就不建边 题目中保证了不存在奇 ...
- 【转】golang 结构体和方法
原文:https://www.jianshu.com/p/b6ae3f85c683 ---------------------------------------------------------- ...
- Redis之哨兵机制(五)
什么是哨兵机制 Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务: · 监控(Monitoring): 哨兵(sentinel) 会不断 ...
- 微信小程序实现连接蓝牙设备跑步APP
背景 微信小程序兴起,有变成超级APP的趋势,通过微信提供的小程序api,可以通过微信调用到手机原生的支持. 目标 通过微信小程序实现来实现跑步类App的功能. 需求分析 跑步类App需要的两个核心的 ...
- 微信小程序获取地理位置授权
微信小程序获取地理位置授权,首先需要在app.json中添加配置: "permission": { "scope.userLocation": { " ...
- ansible模块-user
一.概述user 模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作.二.心得password参数:此参数用于指定用户的密码.但是这个密码不能是明文的密码, ...
- QT 设置应用程序图标和可执行程序图标
1, 首先准备个ICO图标.例如:myappico.ico 在工程目录下新建images文件夹并你的图标myappico.ico(只能用ico格式的图片)放到工程目录下的images文件夹下 2, 用 ...
- Finding Lane Lines on the Road
Finding Lane Lines on the Road The goals / steps of this project are the following: Make a pipeline ...
- parseInt parseFloat isNaN Number 区别和具体的转换规则及用法
原文链接:https://blog.csdn.net/wulove52/article/details/84953998 在javascript 我经常用到,parseInt.parseFloat.N ...
- Luogu P1903 [国家集训队]数颜色 or 维护队列
标准的带修莫队...咕到了现在$qwq$ 莫队是对询问排序来优化复杂度的(不带修就是对询问区间$[l,r]$排序).. 那么现在带修了,我们再可以维护一个时间维度$tm$:对于每个询问,每次回答前先检 ...