`
殇瓶-MIN
  • 浏览: 8483 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

小谈队列

阅读更多

小谈队列

 

虽然数组是存储和访问速度最快的数据结构,但是却受创建时其长度、存储的类型就固定限制这一特性所限制。为此我们引入动态存储数据的数据结构——队列。说到队列,现实生活中还真有不少:食堂打菜的学生、超市等待结账的客户、影院排队购票的观影者,现实生活中总是存在排队现象。当我们把队列搬到计算机、搬到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的单调队列优化-Yuiffy.pdf

    ### DP的单调队列优化详解 ...- 单调队列在多重背包问题中的应用,可以参见“浅谈DP优化之单调队列优化.doc”。 以上内容概述了DP的单调队列优化的基本概念、实现方式及应用场景,希望对学习者有所帮助。

    kafka消息队列学习笔记

    kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列学习笔记,kafka消息队列...

    Socket异步通信,线程,双端队列-计算机网络原理课程设计

    首先,让我们从Socket异步通信谈起。在计算机网络中,Socket是一种编程接口,用于在网络上的两个进程间建立通信链接。异步通信是Socket的一种工作模式,它允许程序在等待数据到达时执行其他任务,而不是被阻塞等待。...

    浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)

    "Java 消息队列技术总结" Java 消息队列是分布式系统中重要的组件,主要解决应用解耦、异步消息、流量削锋等问题,实现高性能、高可用、可伸缩和最终一致性架构。常用的消息队列有 ActiveMQ、RabbitMQ、ZeroMQ、...

    浅谈单调队列、单调栈

    例如:1,3,5,9就是一个单调增数列,数列中不存在后一个数比前一个数小的现象。那么同样,在这里谈到的话题也有类似特点。 先说一下单调队列吧! 单调队列,就是一个符合单调性质的队列,它同时具有单调的性质以及...

    浅谈Java并发 J.U.C之AQS:CLH同步队列

    浅谈Java并发 J.U.C之AQS:CLH同步队列 在 Java 并发编程中,J.U.C(Java Utility Classes)提供了一些高效的并发工具,其中AQS(AbstractQueuedSynchronizer)是一个核心组件之一。AQS内部维护着一个FIFO队列,即...

    浅谈消息队列

    消息队列列的⼀一些要点:服务质量量(QOS)、性能、扩展性等等,下⾯面⼀一⼀一探索这些概念,并谈谈在特定 的消息队列列如kafka或者mosquito中是如何具体实现这些概念的。 服务质量量服务语义 服务质量量⼀一般可以...

    浅谈Vuejs中nextTick()异步更新队列源码解析

    Vue的核心功能之一是其异步更新队列,这一机制保证了在数据发生变化时,Vue能够将这些变化批量处理,然后异步地更新DOM,以避免不必要的重复计算和DOM操作。本文将深入探讨Vue.js中的nextTick()方法以及其背后的异步...

    浅谈使用java实现阿里云消息队列简单封装

    浅谈使用java实现阿里云消息队列简单封装 本文主要介绍了使用Java实现阿里云消息队列的简单封装,包括对阿里云消息队列的介绍、设计方案、消息发送和接收的实现等。 一、阿里云消息队列简介 阿里云提供了两种消息...

    专题资料(2021-2022年)MDaemon邮件服务器队列与统计管理器的使用.doc

    首先,让我们从**日志页面**谈起。日志记录是监控和分析邮件服务器活动的重要途径。通过日志页面,管理员可以导入不同类型的日志,包括SMTP入、SMTP出、POP3和IMAP等。这些日志详细记录了邮件的收发过程,包括邮件的...

    浅谈python多线程和队列管理shell程序

    所以我们用到了队列来管理。 “””我试过gevent,但是会在command这里造成阻塞””” gevent代码如下 如果有朋友知道如何优化,请您告诉我 #!/usr/bin/python2.7 # -*- coding:utf-8 -*- import os,sys from ...

    浅谈java.util.concurrent包中的线程池和消息队列

    "java.util.concurrent包中的线程池和消息队列" java.util.concurrent包中的线程池和消息队列是一种高效的多线程编程技术,主要用于解决处理器单元内多个线程执行的问题。线程池技术可以显著减少处理器单元的闲置...

    浅谈javascript事件环微任务和宏任务队列原理

    事件环主要包括微任务和宏任务队列,这两个队列管理着异步操作的回调执行顺序。 首先,让我们了解一下事件环的工作原理。JavaScript 是一种单线程语言,这意味着在同一时刻只能执行一个任务。当遇到异步代码,如 `...

Global site tag (gtag.js) - Google Analytics