小谈队列
虽然数组是存储和访问速度最快的数据结构,但是却受创建时其长度、存储的类型就固定限制这一特性所限制。为此我们引入动态存储数据的数据结构——队列。说到队列,现实生活中还真有不少:食堂打菜的学生、超市等待结账的客户、影院排队购票的观影者,现实生活中总是存在排队现象。当我们把队列搬到计算机、搬到JAVA程序中,我们需要找寻队列的特性。
每次排队,人们总会自觉从后面加入队列,当然也有那些不遵循喜欢插队,不介意别人嫌弃的眼光的人。一般最先排队的那个人会最先接收业务处理,处理完毕走出队列,还有那些中途有事儿,退出队伍的人物。发现这些特性,我们基本明确了队列的几个普通方法。下面就是队列的数组实现代码。
import java.util.Arrays; /** * 自定义自己的队列,利用数组实现的 * @author Daily * */ public class MyQueque <E>{ // 队列的属性 private int size; // 队列长度 private Object [] array; // 当前数组 /** * 定义MyQueque类的构造方法(默认添加方式) */ public MyQueque(){ } /** * 定义MyQueque类的构造方法(初始化时,添加一个元素) * @param ob 要添加的元素 */ public MyQueque(E ob){ add(ob); } /** * 默认方式 * 向队列中添加一个元素(队列只能从元素组最后一个位置添加元素) * @param ob 要添加的元素 */ public void add(E ob){ // 创建一个数组对象 Object [] newarray = new Object[size+1]; // 存储原数组的前size-1个元素 for (int i=0; i < size; i++){ newarray[i] = array[i]; } newarray[size] = ob; // size减小1个单位 size++; // 在原数组中存入新开辟数组内存首地址的值 array = newarray; } /** * 向队列中添加一个元素(在特定的位置添加元素) * @param index 给定的位置 * @param ob 要添加的元素 */ public boolean add(int index, E ob){ if (index > size){ return false; } // 创建一个数组对象 Object [] newarray = new Object[size+1]; // 存储原数组的前size-1个元素 for (int i=0; i < index; i++){ newarray[i] = array[i]; } newarray[index] = ob; for (int i=index+1; i<size+1; i++){ newarray[i] = array[i-1]; } // size减小1个单位 size++; // 在原数组中存入新开辟数组内存首地址的值 array = newarray; return true; } /** * 默认删除元素(在数组最前面删除一个元素) * @return 删除的元素 */ public E delete(){ // 创建一个数组对象 Object [] newarray = new Object[size-1]; // 存储原数组的前size-1个元素 for (int i=1; i < size; i++){ newarray[i-1] = array[i]; } Object copy = array[0]; // size减小1个单位 size--; // 在原数组中存入新开辟数组内存首地址的值 array = newarray; // 返回最后一个值 return (E)copy; } /** * 根据所给下标位置,删除元素 * @param index 下标位置 * @return 删除的元素 */ public E delete(int index){ if (index > size || index < 0){ return null; } // 创建一个数组对象 Object [] newarray = new Object[size-1]; if (size-1>0){ // 存储原数组的前size-1个元素 for (int i=0; i < size-index; i++){ newarray[i] = array[i]; } for (int i=index+1; i<size; i++){ newarray[i-1] = array[i]; } } Object copy = array[index]; // size减小1个单位 size--; // 在原数组中存入新开辟数组内存首地址的值 array = newarray; // 返回最后一个值 return (E)copy; } /** * 根据元素值,删除数组中的元素(PS:当为Integer类型的变量时,无法与位置查找的删除方法进行区分) * @param ob 删除的元素值 * @return 是否删除成功 */ public boolean delete(E ob){ int count = 0; boolean bl = false; for (int i=0; i<size; i++){ if (array[i].equals(ob)){ count++; bl = true; } } // 创建一个数组对象 Object [] newarray = new Object[size-count]; int u=0; // 存储原数组的前size-1个元素 for (int i=0; i < size; i++){ if (!array[i].equals(ob)){ newarray[u] = array[i]; u++; } } // size减小count个单位 size = size -count; // 在原数组中存入新开辟数组内存首地址的值 array = newarray; // 返回删除操作是否执行标志 return bl; } /** * 根据所给位置修改元素 * @param index 需要修改的位置 * @param ob 修改后的值 * @return 是否修改成功 */ public boolean modify(int index,E ob){ array[index] = ob; return true; } /** * 根据所给位置查找元素 * @param index 需要查找的位置 * @return 该位置的元素 */ public E get(int index){ return (E)array[index]; } /** * 根据所给元素值查找位置 * @param index 需要查找的位置 * @return 该位置的元素 */ public int [] get(Object ob){ int count = 0; for (int i=0; i<size; i++){ if (array[i].equals(ob)){ count++; } } int [] flag = new int [count]; int u=0; for (int i=0; i<size; i++){ if (array[i].equals(ob)){ flag[u] = i; u++; } } return flag; } /** * 得到队列的长度 * @return 队列的长度 */ public int getSize(){ return size; } /** * 对队列进行排序 * @return 返回排好序的队列 */ public E [] getSort(){ Arrays.sort(array); return (E[])array; } }
PS:因为所有类型都是Object类型的子类,因而加入元素定义为Object类型的对象,实现了数组不能存储不同类型的功能。而队列每次加入或者删除一个元素的时候,都会新建一个数组来存储相应数据,实现了数据的动态存储。为了将队列中的所有数据规定为同一类型,我使用了泛型。
相关推荐
### DP的单调队列优化详解 ...- 单调队列在多重背包问题中的应用,可以参见“浅谈DP优化之单调队列优化.doc”。 以上内容概述了DP的单调队列优化的基本概念、实现方式及应用场景,希望对学习者有所帮助。
kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列...
首先,让我们从Socket异步通信谈起。在计算机网络中,Socket是一种编程接口,用于在网络上的两个进程间建立通信链接。异步通信是Socket的一种工作模式,它允许程序在等待数据到达时执行其他任务,而不是被阻塞等待。...
"Java 消息队列技术总结" Java 消息队列是分布式系统中重要的组件,主要解决应用解耦、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构。常用的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、...
例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象。那么同样,在这里谈到的话题也有类似特点。 先说一下单调队列吧! 单调队列,就是一个符合单调性质的队列,它同时具有单调的性质以及...
浅谈Java并发 J.U.C之AQS:CLH同步队列 在 Java 并发编程中,J.U.C(Java Utility Classes)提供了一些高效的并发工具,其中AQS(AbstractQueuedSynchronizer)是一个核心组件之一。AQS内部维护着一个FIFO队列,即...
消息队列列的⼀一些要点:服务质量量(QOS)、性能、扩展性等等,下⾯面⼀一⼀一探索这些概念,并谈谈在特定 的消息队列列如kafka或者mosquito中是如何具体实现这些概念的。 服务质量量服务语义 服务质量量⼀一般可以...
Vue的核心功能之一是其异步更新队列,这一机制保证了在数据发生变化时,Vue能够将这些变化批量处理,然后异步地更新DOM,以避免不必要的重复计算和DOM操作。本文将深入探讨Vue.js中的nextTick()方法以及其背后的异步...
浅谈使用java实现阿里云消息队列简单封装 本文主要介绍了使用Java实现阿里云消息队列的简单封装,包括对阿里云消息队列的介绍、设计方案、消息发送和接收的实现等。 一、阿里云消息队列简介 阿里云提供了两种消息...
首先,让我们从**日志页面**谈起。日志记录是监控和分析邮件服务器活动的重要途径。通过日志页面,管理员可以导入不同类型的日志,包括SMTP入、SMTP出、POP3和IMAP等。这些日志详细记录了邮件的收发过程,包括邮件的...
所以我们用到了队列来管理。 “””我试过gevent,但是会在command这里造成阻塞””” gevent代码如下 如果有朋友知道如何优化,请您告诉我 #!/usr/bin/python2.7 # -*- coding:utf-8 -*- import os,sys from ...
"java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...
事件环主要包括微任务和宏任务队列,这两个队列管理着异步操作的回调执行顺序。 首先,让我们了解一下事件环的工作原理。JavaScript 是一种单线程语言,这意味着在同一时刻只能执行一个任务。当遇到异步代码,如 `...