`
殇瓶-MIN
  • 浏览: 8034 次
  • 性别: 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类型的对象,实现了数组不能存储不同类型的功能。而队列每次加入或者删除一个元素的时候,都会新建一个数组来存储相应数据,实现了数据的动态存储。为了将队列中的所有数据规定为同一类型,我使用了泛型。

 

分享到:
评论

相关推荐

    MQ服务消息队列介绍

    MQ服务器端和客户端通信浅谈 1. WebSphere MQ的服务端的安装和配置 (1)创建名为venus.queue.manager的默认队列管理器。 在DOS窗口命令提示符下,输入以下命令: crtmqm -q venus.queue.manager (2)启动...

    kafka消息队列学习笔记

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

    浅谈几类背包题-浅谈几类背包题-单调队列优化(PASCAL).pdf

    浅谈几类背包题-浅谈几类背包题-单调队列优化(PASCAL).pdf

    浅谈单调队列、单调栈

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

    浅谈Laravel队列实现原理解决问题记录

    在使用laravel中的队列时,产生冲突干扰。 查找问题原因 在laravel 队列的操作类Illuminate\Queue\RedisQueue.php中可以看到pushRaw()方法: // 将一任务推入队列中 public function pushRaw($payload, $queue = ...

    浅谈消息队列

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

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

    AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。下面小编来简单介绍下这个队列

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

    主要介绍了浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

    本篇文章主要介绍了浅谈Vuejs中nextTick()异步更新队列源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    解析VNXCLARiiON端口队列饱和问题

    今天跟大家分享一个关于存储性能的话题,正所谓“路漫漫其修远兮”,我觉得I/O路径就是这样一条不归路,好生难伺候,从Application -...本文我们将谈一谈EMC中端存储QFULL(队列饱和)的问题,看看它能告诉我们些什么。

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

    主要介绍了浅谈java.util.concurrent包中的线程池和消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

    算法原理与实践课件4_栈与队列.pdf

    谈面试中的算法和编程准备。 Linkedln面试官,三年面试经验,面试人数150+,国内外Offer 10+,丰富的国内+海外工作经验。

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

    主要介绍了浅谈使用java实现阿里云消息队列简单封装,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    国家集训队2009论文集浅谈几类背包题

    国家集训队2009论文集浅谈几类背包题,包括了单调队列优化的多重背包,完全背包等常见背包的详细解法

    浅谈动态规划的几种优化方法

    动态规划是求解最优化问题的一种方法;动态规划虽然空间复杂度...另外,也收录了解决NP问题小规模求解中,优于搜索的状态压缩动态规划。 关键词:动态规划优化,四边形不等式,斜率优化,单调队列,状态压缩动态规划。

Global site tag (gtag.js) - Google Analytics