Java数组队列概念与用法实例分析
作者:WFaceBoss 发布时间:2023-11-18 04:18:31
本文实例讲述了Java数组队列概念与用法。分享给大家供大家参考,具体如下:
一.队列的概念
(1)队列也是一种线性结构
(2)相比数组,队列对应的操作是数组的子集
(3)只允许在一端插入数据操作,在另一端进行删除数据操作,进行插入操作的一端称为队尾(入队列),进行删除操作的一端称为队头(出队列)
(4)队列是一种先进先出的数据结构(FIFO)
此处我们先来学习一下顺序队列 ,顺序队列 就是用数组实现:比如有一个n个元素的队列,数组下标0的一端是队头,入队操作就是通过数组下标一个个顺序追加,不需要移动元素,但是如果删除队头元素,后面的元素就要往前移动,对应的时间复杂度就是O(n)。
对于队列,我们关注的相关实现如下:
二、代码实现
对于该节的相关代码,我们新建一个package(Queue),同时为了理解方便,此时把动态数组相关代码拷贝到该包中。
1.先创建一个Queue接口,里面定义上面所述的方法
package Queue;
public interface Queue<E> {
//获取队列中元素个数
int getSize();
//队列中元素是否为空
boolean isEmpty();
//入队列
void enqueue(E e);
//出队列
E dequeue();
//获取队首元素
E getFront();
}
2.创建一个类ArrayQueue实现Queue接口并重写Object类的toString()方法
package Queue;
public class ArrayQueue<E> implements Queue<E> {
private DynamicArray<E> array;
//构造函数,传入队列的容量capacity构造函数
public ArrayQueue(int capacity) {
array = new DynamicArray<E>(capacity);
}
//无参构造函数,默认队列的容量capacity=10
public ArrayQueue() {
array = new DynamicArray<E>();
}
//获取队列中元素数据是否为空
@Override
public boolean isEmpty() {
return array.isEmpty();
}
//获取队列中元素个数
@Override
public int getSize() {
return array.getSize();
}
//获取队列的容量
public int getCapacity() {
return array.getCapacity();
}
//入队操作
@Override
public void enqueue(E e) {
array.addLast(e);
}
//出队操作
@Override
public E dequeue() {
return array.removeFirst();
}
//获取队首元素
@Override
public E getFront() {
return array.getFirst();
}
//重写object类的toString方法
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append("Queue:");
res.append("front [");//体现左侧为队首
for (int i = 0; i < array.getSize(); i++) {
res.append(array.get(i));
if (i != array.getSize() - 1) {
res.append(",");
}
}
res.append("] tail");//体现右侧为队尾
return res.toString();
}
}
3.测试
新建一个TestMain类,添加一个main函数来测试我们编写好的ArrayQueue类
相关代码如下:
package Queue;
public class TestMain {
public static void main(String[] args) {
ArrayQueue<Integer> queue = new ArrayQueue<Integer>();
for (int i = 0; i < 10; i++) {
queue.enqueue(i);
System.out.println(queue);
if(i%3==2){//每添加3个元素出队列一个
queue.dequeue();
System.out.println(queue);
}
}
}
}
对于第7行代码是测试入队列操作的,第10、11行代码的意思是每添加3个元素出队列一个元素。结果为:
三、数组队列的复杂度分析
对于出队的时间复杂度为O(n)的解释:
由于实现数组队列的底层是动态数组,入队操作就是通过数组下标一个个顺序追加,不需要移动元素,但是如果删除队头元素(removeFirst()方法),后面的元素就要往前移动,对应的时间复杂度就是O(n)。这样当有数组中有大量数据时性能肯定是不好的,下一节我们将进行改进,使得出队的时间复杂度为O(1)。
源码地址 https://github.com/FelixBin/dataStructure/tree/master/src/Queue
希望本文所述对大家java程序设计有所帮助。
来源:https://www.cnblogs.com/wfaceboss/p/10627316.html


猜你喜欢
- 前言在Android中经常要使用Dialog来实现一些提示以及一些特殊的效果,而且样式也不一样,每次都得查一大堆资料,还不一定能解决。对话框
- 这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 一,FileWritter写入文件FileWritter, 字符流写入字符到文件。默认情况下,它会使用新的内容取代所有现有的内容,然而,当指
- 代理模式代理模式(Proxy Pattern)是一种结构性模式。代理模式为一个对象提供了一个替身,以控制对这个对象的访问。即通过代理对象访问
- 一:ArrayList和LinkedList的大致区别如下:1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长
- java arrayList遍历的四种方法及Java中ArrayList类的用法package com.test;import java.u
- 本文实例讲述了spring boot validation参数校验。分享给大家供大家参考,具体如下:对于任何一个应用而言在客户端做的数据有效
- 在一些购物商城中经常会遇到这类效果,效果图如下:先看效果图步骤一:完成对主界面main.xml的创建:<?xml version=&q
- 本文实例讲述了C#自定义签名章实现方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- 本文实例为大家分享了Android仿Iphone屏幕底部弹出效果的具体代码,供大家参考,具体内容如下main.xml如下: <?xml
- Android通过访问网页查看网页源码1.添加网络权限<!--访问网络的权限--> <uses-permission an
- 当前单元格指的是DataGridView焦点所在的单元格,它可以通过DataGridView对象的CurrentCell属性取得。如果当前单
- 题目:求1+2!+3!+...+20!的和程序分析:此程序只是把累加变成了累乘。程序设计:public class Ex21 {  
- 在前面几篇文章中,我们详细介绍了Androi
- 前言说道Android中的Activity,如果你做过iOS开发的话,Activity类似于iOS中的ViewController(视图控制
- 先扯再说最近一直在研究某个国产开源的MySQL数据库中间件,拉下其最新版的代码到eclipse后,启动起来,然后做各种测试和代码追踪;用完想
- 一、前言在编码过程中,常常需要写打印日志语句,我们期望的是同一个业务的日志都在一块,在出问题的时候好根据日志来排查问题。而现实是在应用运行中
- 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容
- 前言Word中可以针对不同文档排版设计要求来设置背景设置颜色。常见的可设置单一颜色、渐变色或加载图片来设置成背景。下面通过Java来设置以上
- multipartResolver上传文件配置1、gradle配置 compile ('commons-i