`

queue (用 java 简单实现)

阅读更多

queue

 

------

结构

 

线性存储,1个出口 & 1个入口,

first-in, first-out

 

------

操作

 

* insert (enqueue)

在入口处添加,

时间复杂度:O(1)

* delete (dequeue)

在出口处删除,

时间复杂度:O(1)

 

------

实现方案:

 

用 Object[] 存贮数据,类采用泛型,

add() & remove() 方法,对数组进行操作,并用 synchronized 控制并发,

数组 小index 是 head,大index是tail,

插入在 tail 处,删除在 head 处,

 

用2个变量分别保存当前 下次 插入 & 删除 时的 index,

 

提供对数据长度的扩增方法,以保证数组长度够,

 

------

例子:

 

package eric.algrathem.struct.queue;

import java.util.Arrays;
import java.util.Collection;

/**
 * <p>
 * structure for queue
 * </p>
 * <p>
 * 用1个数组存数据,数组 小index 是 head,大index是tail,<br />
 * 插入在 tail 处,删除在 head 处,
 * </p>
 * 
 * @author eric
 * @param <E>
 */
public class QueueStruct<E> {
	/** 初始容量 */
	public static final int DEFAULT_SIZE = 10;
	/** 容量不足时翻倍数 */
	public static final float DEFAULT_INCREMENT = 1.5f;
	/** 数据 */
	private Object[] elementData;
	/** 元素个数 */
	private int elementCount;
	/** 数组的头部,即 下次删除数据的 index */
	private int head;
	/** 数组的尾部,即 下次插入数据的 index */
	private int tail;

	public QueueStruct() {
		this(DEFAULT_SIZE);
	}

	public QueueStruct(int size) {
		this.elementData = new Object[size];
		this.elementCount = 0;
		this.head = 0;
		this.tail = 0;
	}

	public QueueStruct(Object[] data) {
		this.elementData = data;
		this.elementCount = data.length;
		this.head = 0;
		this.tail = 0;
	}

	public QueueStruct(Collection<? extends E> c) {
		this(c.toArray());
	}

	/**
	 * 添加数据 到尾部
	 * 
	 * @param ele
	 * @return
	 */
	public synchronized E add(E ele) {
		if (tail >= elementData.length) {
			adjustData();
		}
		elementData[tail] = ele;
		elementCount++;
		tail++;
		return ele;
	};

	/**
	 * 删除数据 从头部
	 * 
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public synchronized E remove() {
		E e = (E) elementData[head];
		elementData[head] = null;
		elementCount--;
		head++;
		return e;
	};

	/**
	 * 获得当前的数据
	 * 
	 * @return
	 */
	public synchronized Object[] getData() {
		return Arrays.copyOfRange(this.elementData, this.head, this.tail);
	}

	public synchronized void adjustData() {
		if (tail >= elementData.length) { // tail 处空间不足时调用
			// head 的空位去掉
			int newSize = (elementData.length == elementCount) ? (int) Math.ceil(elementCount * DEFAULT_INCREMENT)
					: elementData.length;
			elementData = Arrays.copyOfRange(elementData, head, elementData.length);
			// 调整空间
			elementData = Arrays.copyOf(elementData, newSize);
			tail = elementCount;
			head = 0;
		}
	}
}

 

package eric.algrathem.struct.queue;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.junit.Test;

public class QueueStructTest extends TestCase {
	@Test
	public void test() {
		QueueStruct<Integer> queueOne = new QueueStruct<Integer>();
		// 第1次 加入个数
		int addCountOne = 30;
		// 第1次 删除个数
		int removeCountOne = 20;
		// 第2次 加入个数
		int addCountTwo = 10;

		for (int i = 0; i < addCountOne; i++) {
			queueOne.add(i);
		}
		Object[] data = queueOne.getData();
		for (int i = 0; i < data.length; i++) {
			Assert.assertTrue((Integer) data[i] == i);
		}

		for (int i = 0; i < removeCountOne; i++) {
			Assert.assertTrue(queueOne.remove() == i);
		}

		for (int i = 0; i < addCountTwo; i++) {
			queueOne.add(i * 10);
		}
		Object[] data2 = queueOne.getData();
		int baseCount = addCountOne - removeCountOne;
		for (int i = 0; i < addCountTwo; i++) {
			Assert.assertTrue((Integer) data2[baseCount + i] == i * 10);
		}
	}

	public static void main(String[] args) {
		new QueueStructTest().test();
	}
}
 

 

------

分享到:
评论

相关推荐

    利用Vector类(继承)编写一个先进先出的队列类Queue java实现

    ### 使用Vector类(继承)实现先进先出队列类Queue的Java实现 #### 概述 本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入...

    FCFS.rar_Java fcfs_Queue systems java_fcfs _queue java_处理机调度

    可以使用Java的内置数据结构,如LinkedList或PriorityQueue来实现这一点。 3. **模拟过程** 当新进程到达时,将其插入到队列的末尾。每次CPU空闲时,选择队列首部的进程进行执行,执行完后将其从队列中移除。这个...

    java多线程模拟队列实现排队叫号

    在Java中,我们可以使用`java.util.Queue`接口及其实现类,如`LinkedList`或`ArrayDeque`来创建队列。 接下来,我们需要创建两个线程类:一个是`CustomerThread`,代表等待叫号的客户,另一个是`ServiceThread`,...

    Java使用数组实现简单的队列操作SimpleQueue

    数据结构学习-Java使用数组实现简单的队列操作SimpleQueue,简单易懂,适合初学者。

    Java数据结构实现之Queue.zip

    以下是一个简单的示例,演示如何使用`LinkedList`实现队列: ```java import java.util.LinkedList; public class QueueExample { public static void main(String[] args) { LinkedList&lt;Integer&gt; queue = new ...

    Java队列实现,数据结构

    在这个Java队列实现的数据结构作业练习中,我们将会探讨如何使用Java来创建一个简单的队列,并分析`Queue.java`和`Node.java`这两个文件可能包含的内容。 首先,`Queue.java`很可能是实现队列接口或类的文件。在...

    用Java实现数据结构中的队列

    本篇文章将深入探讨如何用Java语言来实现这种基本的数据结构。 1. **队列的基本操作** - **enqueue()**: 将元素添加到队列的尾部。这是队列的插入操作。 - **dequeue()**: 移除并返回队列的头部元素。这是队列的...

    Queue-using-linked-list.zip_queue java

    这个简单的实现展示了如何使用链表数据结构构建一个Java队列。`enqueue()`方法用于在队尾插入元素,`dequeue()`方法用于从队头移除元素。`isEmpty()`检查队列是否为空,`size()`返回队列的长度。 ### 应用场景 - *...

    java实现的一个简单邮箱功能

    在本项目中,"java实现的一个简单邮箱功能"是一个基于Java编程语言的示例应用,旨在帮助初学者理解和掌握如何构建基本的电子邮件系统。通过分析给出的文件名,我们可以推测这个项目包含以下主要组件: 1. **...

    重传Java实现DFS,BFS

    以下是一个简单的基于栈的DFS Java实现: ```java import java.util.Stack; public class DFS { private Stack&lt;Integer&gt; stack; public void dfs(int[][] graph, int start) { stack = new Stack(); stack....

    Java实现语音播报 实例源码下载

    在Java编程环境中,实现语音播报功能可以极大地提升用户体验,尤其在一些需要自动化读取信息或者无障碍辅助的应用场景中。这个实例源码下载提供了在Java中集成语音合成技术的方法。下面我们将详细探讨Java实现语音...

    数据结构JAVA实现

    这个压缩包中的代码示例可能包含了这些数据结构的实现,例如,链表可能包含`Node`类和相关的操作方法,有序二叉树可能有`BinarySearchTree`类,队列则可能是对`Queue`接口的简单实现。通过学习和理解这些代码,...

    Java实现spooling假脱机技术

    Java实现的Spooling(Simultaneous Peripheral Operations On-Line)假脱机技术是一种将低速设备如打印机的工作与计算机的高速处理分离的技术。在传统的批处理系统中,Spooling技术用于提高系统的效率,允许多个任务...

    操作系统生产者与消费者问题Java简单模拟实现

    总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...

    java-数据结构代码实现

    11. **测试框架**:该代码实现使用了JUnit 4进行单元测试,JUnit是Java中广泛使用的测试框架,它使得编写和运行测试变得简单,确保代码的正确性。 这个压缩包对于初学者和有一定经验的Java开发者来说都是宝贵的资源...

    java多叉树的实现和遍历输出

    本篇文章将深入探讨如何在Java中实现多叉树以及其遍历方法。 首先,我们需要定义一个多叉树节点类。这个类通常包含一个数据字段来存储节点值,以及一个ArrayList或LinkedList等动态数组来存储子节点。以下是一个...

    进程调度的两种算法JAVA实现----FCFS(先来先服务)和SJF(最短作业优先)

    // 这里可以填充实际的执行代码,这里用简单的延时表示 try { Thread.sleep(time * 100); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个示例中,`Queue&lt;Process&gt;`用于存储待...

    java 队列实现

    通常,我们会使用Java的标准库`java.util.Queue`接口及其实现,如`LinkedList`或`ArrayDeque`。 以下是一个简单的基于`LinkedList`实现的队列示例: ```java import java.util.LinkedList; import java.util.Queue...

    二叉树 层序遍历 java实现 课程设计

    在Java中,可以使用`java.util.LinkedList`作为队列实现,或者使用`java.util.Queue`接口配合`java.util.ArrayDeque`实现。下面是一个基本的Java代码实现示例: ```java import java.util.*; public class ...

Global site tag (gtag.js) - Google Analytics