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.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
随机推荐
- Python3+Appium学习笔记02-环境配置(下)
配置所需软件及我当前使用的版本: 1)java jdk 1.8.0 2)android sdk 24.4.1 3)Python3 3.7.3 4)Appium-Python-Client 5)n ...
- Java&Python&Appium 驱动APP及Desired Capabilities配置
一.摘要 本篇博文,将阐述如何将环境&代码&APP联系起来工作 二.Java代码 我们先看一段真实的java代码,我将他放在了TestNG框架的@BeforeTest里,执行这段即可启 ...
- move post process stack from package to asset
这东西折腾了我好久 原来一直都是打开的方式不对 package 文件夹里面的manifest文件 改相应的package为文件路径引用 "com.unity.render-pipel ...
- P4145——线段树点修改&&模板题
题目 链接 题意:对一个数列进行以下两种操作: 给$[l,r]$中的每个数开平方(下取整) 询问$[l,r]$中各个数的和 解决方法 显然,区间开平方不满足区间可加性,所以对区间中每个数开平方不能通过 ...
- 01-vue和api整合流程、CORS
1.后端代码 1.项目结构 2.项目代码 主url from django.contrib import admin from django.urls import path, include url ...
- 【Android-GridView控件】 九宫格
效果图: 1.主界面布局 activity_main.xml GridView的三种属性: android:numColumns="" 每一行显示多少列 android:horiz ...
- WebService如何封装XML请求 以及解析接口返回的XML
原 WebService如何封装XML请求 以及解析接口返回的XML 置顶 2019年08月16日 15:00:47 童子泛舟 阅读数 28 标签: XML解析WebService第三方API 更多 ...
- 2019CCPC秦皇岛自我反省&部分题解
练了一年半了,第一次打CCPC,险些把队友坑了打铁,最后也是3题危险捡了块铜. 非常水的点双连通,我居然不相信自己去相信板子,唉,结果整来整去,本来半个小时能出的题,整到了3个小时,大失误呀,不然就可 ...
- 【CUDA 基础】5.0 共享内存和常量内存
title: [CUDA 基础]5.0 共享内存和常量内存 categories: - CUDA - Freshman tags: - 共享内存 - 常量内存 toc: true date: 2018 ...
- Python数据抓取(3) —抓取标题、时间及链接
本次分享,jacky将跟大家分享如何将第一财经文章中的标题.时间以及链接抓取出来 (一)观察元素抓取位置 网页的原始码很复杂,我们必须找到特殊的元素做抽取,怎么找到特殊的元素呢?使用开发者工具检视每篇 ...