网站首页 > java教程 正文
队列的相关概念
队列(queue)种线性数据结构,遵循“先进先出”的原则。我们可以将其想象成排队买票,先来的人先买到票。
与栈结构不同的是,队列是双端开口。类似一个管道,只能从一端进入,从另一端离开。
队列的两个基本操作:入队 将一个数据放到队列尾部;出队 从队列的头部取出一个元素。
下面我们通过之前封装好的数组实现“队列“手写java数据结构(动态数组)
//定义一个Queue接口 public interface Queue<E> { void enqueue(E e); E dequeue(); E getFront(); int getSize(); boolean isEmpty(); } //定义一个ArrayQueue类实现Queue接口 public class ArrayQueue<E> implements Queue<E> { //默认数组 private Array<E> array; //初始化容量的构造函数 public ArrayQueue(int capacity){ array = new Array<>(capacity); } //无参构造函数,默认容量为10 public ArrayQueue(){ array = new Array<>(); } //入队 @Override public void enqueue(E e) { //往数组中添加元素(通过数组模拟队列,我们将数组从左往右看,数组左边是队首,数组右边是队尾。) array.addLast(e); } //出队 @Override public E dequeue() { //删除并返回数组下标为0的元素,然后将其余元素左移。 return array.removeFirst(); } //查看队首元素 @Override public E getFront() { //获取数组下标为0的元素 return array.get(0); } //获取队列长度 @Override public int getSize() { //返回数组长度 return array.getSize(); } //判断队列是否是空队列 @Override public boolean isEmpty() { //数组是否为空 return array.isEmpty(); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("queue:"); sb.append("front["); for(int i = 0;i < array.getSize(); i++){ sb.append(array.get(i)); if(i!=array.getSize()-1){ sb.append(","); } } sb.append("]end"); return sb.toString(); } }
我们可以发现这种实现方式入队操作均摊复杂度是O(1) (触发扩容时是O(n)) ,而出队操作是O(n),原因是出队时需要移除数组第一个元素并将其他元素整体往左移动一位。
下一篇我们通过实现一个循环队列来解决出队操作性能低下的问题
---------本文源于日常学习笔记记录,如有错误欢迎批评指正
猜你喜欢
- 2024-09-11 阿里架构师剖析:Redis常用数据类型对应的数据结构
- 2024-09-11 聊聊经典数据结构HashMap,逐行分析每一个关键点
- 2024-09-11 压箱底Redis面试集-48.Redis 的 ListPack 数据结构是什么?
- 2024-09-11 JAVA进阶知识学习-day03 数据结构&List集合&Set集合
- 2024-09-11 Java数据结构面试必问:HashMap 底层实现原理分析
- 2024-09-11 Java路径-31-Java数据结构(我的世界java路径错误怎么办)
- 2024-09-11 《数据结构》第九篇、java中ArrayList源码解析
- 2024-09-11 JDK源码分析--Object(jdk1.8源码详细介绍)
- 2024-09-11 「Java数据结构」Java对象的比较(java对比两个对象属性的变化)
- 2024-09-11 动图+源码,演示Java中常用数据结构执行过程及原理
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)