自己实现数据结构系列四---Queue
一.代码部分
1.定义接口:
public interface Queue<E> {
void enqueue(E e);
E dequeue();
E getFront();
int getSize();
boolean isEmpty();
}
2.基于数组的实现
public class ArrayQueue<E> implements Queue<E> {
private ArrayList<E> arrayList;
public ArrayQueue(int capacity){
arrayList = new ArrayList<>(capacity);
}
public ArrayQueue(){
arrayList = new ArrayList<>();
}
@Override
public void enqueue(E e) {
arrayList.addLast(e);
}
@Override
public E dequeue() {
return arrayList.removeFirst();
}
@Override
public E getFront() {
return arrayList.get(0);
}
@Override
public int getSize() {
return arrayList.getSize();
}
@Override
public boolean isEmpty() {
return arrayList.isEmpty();
}
}
3.改进链表实现队列:
public class LinkedListQueue<E> implements Queue<E> {
//节点,用来存放数据:数据+下一个元素的引用
private class Node{
private E e;
private Node next;
public Node(E e,Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e,null);
}
public Node(){
this(null,null);
}
public String toString(){
return e.toString();
}
}
private Node head;//头节点
private Node tail;//尾节点
private int size;
public LinkedListQueue(){
head = null;
tail = null;
size =0;
}
@Override
public void enqueue(E e) {
if (tail == null){
tail = new Node(e);
head = tail;
}else {
tail.next = new Node(e);
tail = tail.next;
}
size++;
}
@Override
public E dequeue() {
if(isEmpty())
throw new IllegalArgumentException("empty");
Node retNode = head;
head = head.next;
retNode.next = null;
if (head == null){
tail = null;
}
size--;
return retNode.e;
}
@Override
public E getFront() {
if(isEmpty())
throw new IllegalArgumentException("empty");
return head.e;
}
@Override
public int getSize() {
return size;
}
@Override
public boolean isEmpty() {
return size ==0;
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("queue:front");
Node cur = head;
while (cur != null){
res.append(cur + "->");
cur = cur.next;
}
res.append("null tail");
return res.toString();
}
}
3.循环队列:
public class LoopQueue<E> {
private E[] data;
private int front;//队列头
private int tail;//队列尾
private int size;
/**
* 初始化容量的构造方法
* @param capacity
*/
public LoopQueue(int capacity){
data = (E[]) new Object[capacity+1]; //注意加一
front = 0;
tail = 0;
size = 0;
}
/**
* 无参的构造方法
*/
public LoopQueue(){
this(10);
}
public int getCapacity(){
return data.length-1;
}
public boolean isEmpty(){
return front == tail;
}
public int getSize(){
return size;
}
/**
* 改变数组容量
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity+1];
for (int i = 0; i < size; i++) {
newData[i] = data[(i+front)%data.length];
}
data = newData;
front = 0;
tail = size;
}
/**
* 入队
* @param e
*/
public void enqueue(E e){
if ((tail+1)%data.length == front){
resize(getCapacity()*2);
}
data[tail] = e;
tail = (tail+1)%data.length;//注意这里不是tail++
size++;
}
/**
* 出队
* @return
*/
public E dequeue(){
if (isEmpty()){
throw new IllegalArgumentException("can't dequeue");
}
E ret = data[front];
data[front] = null;
front = (front+1)%data.length;//注意这里不是front++
size--;
if(size == getCapacity()/4 && getCapacity()/2 != 0){
resize(getCapacity()/2);
}
return ret;
}
/**
* 队列头
* @return
*/
public E getFront(){
if (isEmpty()){
throw new IllegalArgumentException("queue is empty");
}
return data[front];
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("queue size =%d, capacity = %d\n"),size,getCapacity());
res.append("front [");
for (int i = front; i != tail; i = (i=1)%data.length) {
res.append(data[i]);
if((i+1)%data.length != tail){
res.append(",");
}
}
res.append("] tail");
return res.toString();
}
}
自己实现数据结构系列四---Queue的更多相关文章
- 【JavaScript数据结构系列】03-队列Queue
[JavaScript数据结构系列]03-队列Queue 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识队列Queue结构 队列,跟我们的日常生活非常贴近,我们前面举例了食堂排队打 ...
- <数据结构系列3>队列的实现与变形(循环队列)
数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...
- 【C#数据结构系列】查找
一:查找 1.1 基本概念和术语 查找(Search)是在数据结构中确定是否存在关键码等于给定关键码的记录的过程.关键码有主关键码和次关键码.主关键码能够唯一区分各个不同的记录,次关键码通常不能唯一区 ...
- <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)
首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...
- 【JavaScript数据结构系列】04-优先队列PriorityQueue
[JavaScript数据结构系列]04-优先队列PriorityQueue 码路工人 CoderMonkey 转载请注明作者与出处 ## 1. 认识优先级队列 经典的案例场景: 登机时经济舱的普通队 ...
- 【JavaScript数据结构系列】00-开篇
[JavaScript数据结构系列]00-开篇 码路工人 CoderMonkey 转载请注明作者与出处 ## 0. 开篇[JavaScript数据结构与算法] 大的计划,写以下两部分: 1[JavaS ...
- 前端构建大法 Gulp 系列 (四):gulp实战
前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- Netty4.x中文教程系列(四) 对象传输
Netty4.x中文教程系列(四) 对象传输 我们在使用netty的过程中肯定会遇到传输对象的情况,Netty4通过ObjectEncoder和ObjectDecoder来支持. 首先我们定义一个U ...
随机推荐
- Windows 系统下 mysql workbench 的安装及环境配置
1.MySQL的官网地址:https://www.mysql.com/ 2,选择DOWNLOADS 3.选择community 再MySQL workbench 4.安装MySQL workbench ...
- xshell的一些常用配置
1 在xshell中鼠标滚轮和右键的快捷方式 利用鼠标滚轮和右键快速粘贴上面复制的内容 打开xshell的工具---选项-----键盘和鼠标 点击确定 回到xshell即可使用
- python Docker 查看私有仓库镜像
pip 安装: 首先安装epel扩展源: yum -y install epel-release 更新完成之后,就可安装pip: yum -y install python-pip 安装完成之后清 ...
- JS页面打印
平常浏览网页和文档的时候,随处可见打印两个字,有时候不小心点到或者快捷键触发到,就会弹出一个打印的页面,上边显示的打印机是GoldGrid Virtual Printer,这是计算机的虚拟打印机,打印 ...
- ES5-ES6-ES7_集合Set和Map
集合的概念 集合是一组无序且唯一(元素不能重复)的项组成的.这个数据结构使用了与有限集合相同的数学概念,应用在计算机的数据结构中 特点:key和value相同,没有重复的value Set集合 ES6 ...
- C#深度学习のTask(基于任务的异步模型)
一.Task关键字解释 Task 类的表示的单个操作不会返回一个值,通常以异步方式执行. Task 对象是一种的中心思想 基于任务的异步编程模式 首次引入.NET Framework 4 中. 因为由 ...
- dep包安装与依赖库
安装 点击下载 .deb 包:使用sudo dpkg -i xxx.deb 命令安装 依赖库问题 用sudo apt-get install -f解决依赖问题,解决后重新运行dpkg -i安装命令 验 ...
- pandas 选择列或者添加列生成新的DataFrame
选择某些列 import pandas as pd # 从Excel中读取数据,生成DataFrame数据 # 导入Excel路径和sheet name df = pd.read_excel(exce ...
- Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接
Debian系统下实现通过wpa_config连接WPA-PSK加密的Wifi连接 文章参考:BASST | BLOG : Setting up Wifi - Debian Wheezy 预环境 De ...
- docker 14 dockerfile自定义mycentos
Base镜像(scratch) Docker Hub中99%的镜像是通过在base镜像中安装和配置需要的软件构建出来的.也就是说base镜像是所有其他镜像的鼻祖. hub默认centos镜像是什么情况 ...