- 浏览: 442901 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (158)
- J2SE (15)
- c/c++ (17)
- linux & ubuntu (20)
- js (18)
- algorithm (21)
- android (1)
- software (3)
- svn (1)
- db (6)
- other (19)
- css (5)
- go (1)
- html 5 (3)
- computer science (1)
- php (3)
- 创业 (8)
- EJB & jboss (1)
- TDD (1)
- jsp & servlet (2)
- http, tcp & ip (2)
- hibernate (1)
- json (1)
- 乐 (2)
- ps (2)
- netbeans (1)
- extjs (2)
- eclipse (4)
- 项目管理 (1)
- varnish (2)
- study abroad (1)
- python (1)
- erlang (1)
- math (1)
- shell (1)
- assembly (4)
- lucene (1)
- web (1)
- http (1)
- tcp & ip (1)
最新评论
-
yiguxianyun:
...
css li 不换行 -
stdayong:
...
netbeans 中使用 maven -
程序猿_星:
为啥会中文乱码啊
servlet 以 gzip 格式返回数据 -
huanhuan519:
感谢分享~
gdb 调试工具 -
heyl1234:
写过些js,对css还不熟。谢谢~
css li 不换行
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(); } }
------
发表评论
-
c - linkedlist
2012-05-10 14:52 1080c - linkedlist store ordere ... -
c - word counter (binary-tree)
2012-05-09 14:17 1724c - word counter (binary-tree) ... -
random select
2011-08-28 01:00 1205random select problem: ... -
sparse data structure - matrix
2011-08-18 20:03 1079sparse data structure sp ... -
max sub_sequence - c
2011-08-10 01:02 1073max sub_sequence - c /* ... -
binary search - c
2011-08-06 12:07 1090binary search - c (simple) ... -
bit_array - simple use
2011-05-28 23:47 1006bit array,use less memory to de ... -
linkedlist - java 简单实现
2011-02-11 21:29 1592linked list 链表, - ... -
Medians and Order Statistics (次序统计)
2011-01-03 14:36 2827Medians and Order Statistics - ... -
counting sort
2011-01-02 20:36 1563counting sort ------ counting ... -
quick sort
2011-01-01 20:26 1189quicksort ------ quicksort ove ... -
priority queue
2010-12-22 00:11 2268priority queue priority queue ... -
heap sort
2010-12-18 19:09 1205heapsort ------ heap 数据结构 hea ... -
merge sort
2010-12-01 23:37 1149merge sort 合并排序 ------ merge ... -
insertion sort
2010-10-28 00:21 1044insertion sort ------ insertio ... -
z 字型 读取 矩阵
2010-10-23 16:50 2190以 z 字型 读取 矩阵, ... -
排序算法:求 长度为 n的 数组中,最大的 m个数
2010-08-31 10:16 2628排序:数组 length=m,从其中中取出最大的 n 数字,n ... -
已排序数组 a,求其元素的绝对值 共有多少个不同的值
2010-08-29 20:41 1599已排序数组 a,求其元素的绝对值 共有多少个不同的值? ... -
binary search
2010-08-29 19:35 967binary search in sorted array: ... -
An Introduction to Algorithm 2nd 's contents
2010-08-11 23:02 1184算法导论(2nd) 结构 * <Introductio ...
相关推荐
### 使用Vector类(继承)实现先进先出队列类Queue的Java实现 #### 概述 本篇文章将详细介绍如何利用Java中的`Vector`类来实现一个具有先进先出特性的队列类`Queue`。队列是一种特殊的线性表,只允许在一端进行插入...
可以使用Java的内置数据结构,如LinkedList或PriorityQueue来实现这一点。 3. **模拟过程** 当新进程到达时,将其插入到队列的末尾。每次CPU空闲时,选择队列首部的进程进行执行,执行完后将其从队列中移除。这个...
在Java中,我们可以使用`java.util.Queue`接口及其实现类,如`LinkedList`或`ArrayDeque`来创建队列。 接下来,我们需要创建两个线程类:一个是`CustomerThread`,代表等待叫号的客户,另一个是`ServiceThread`,...
数据结构学习-Java使用数组实现简单的队列操作SimpleQueue,简单易懂,适合初学者。
以下是一个简单的示例,演示如何使用`LinkedList`实现队列: ```java import java.util.LinkedList; public class QueueExample { public static void main(String[] args) { LinkedList<Integer> queue = new ...
在这个Java队列实现的数据结构作业练习中,我们将会探讨如何使用Java来创建一个简单的队列,并分析`Queue.java`和`Node.java`这两个文件可能包含的内容。 首先,`Queue.java`很可能是实现队列接口或类的文件。在...
本篇文章将深入探讨如何用Java语言来实现这种基本的数据结构。 1. **队列的基本操作** - **enqueue()**: 将元素添加到队列的尾部。这是队列的插入操作。 - **dequeue()**: 移除并返回队列的头部元素。这是队列的...
这个简单的实现展示了如何使用链表数据结构构建一个Java队列。`enqueue()`方法用于在队尾插入元素,`dequeue()`方法用于从队头移除元素。`isEmpty()`检查队列是否为空,`size()`返回队列的长度。 ### 应用场景 - *...
在本项目中,"java实现的一个简单邮箱功能"是一个基于Java编程语言的示例应用,旨在帮助初学者理解和掌握如何构建基本的电子邮件系统。通过分析给出的文件名,我们可以推测这个项目包含以下主要组件: 1. **...
以下是一个简单的基于栈的DFS Java实现: ```java import java.util.Stack; public class DFS { private Stack<Integer> stack; public void dfs(int[][] graph, int start) { stack = new Stack(); stack....
在Java编程环境中,实现语音播报功能可以极大地提升用户体验,尤其在一些需要自动化读取信息或者无障碍辅助的应用场景中。这个实例源码下载提供了在Java中集成语音合成技术的方法。下面我们将详细探讨Java实现语音...
这个压缩包中的代码示例可能包含了这些数据结构的实现,例如,链表可能包含`Node`类和相关的操作方法,有序二叉树可能有`BinarySearchTree`类,队列则可能是对`Queue`接口的简单实现。通过学习和理解这些代码,...
Java实现的Spooling(Simultaneous Peripheral Operations On-Line)假脱机技术是一种将低速设备如打印机的工作与计算机的高速处理分离的技术。在传统的批处理系统中,Spooling技术用于提高系统的效率,允许多个任务...
总的来说,"操作系统生产者与消费者问题Java简单模拟实现"这个项目提供了一个直观的多线程编程实例,帮助我们理解和实践Java中的线程同步技术,这对于理解和解决实际并发问题具有重要意义。通过分析这个项目,我们...
11. **测试框架**:该代码实现使用了JUnit 4进行单元测试,JUnit是Java中广泛使用的测试框架,它使得编写和运行测试变得简单,确保代码的正确性。 这个压缩包对于初学者和有一定经验的Java开发者来说都是宝贵的资源...
本篇文章将深入探讨如何在Java中实现多叉树以及其遍历方法。 首先,我们需要定义一个多叉树节点类。这个类通常包含一个数据字段来存储节点值,以及一个ArrayList或LinkedList等动态数组来存储子节点。以下是一个...
// 这里可以填充实际的执行代码,这里用简单的延时表示 try { Thread.sleep(time * 100); } catch (InterruptedException e) { e.printStackTrace(); } } } ``` 在这个示例中,`Queue<Process>`用于存储待...
通常,我们会使用Java的标准库`java.util.Queue`接口及其实现,如`LinkedList`或`ArrayDeque`。 以下是一个简单的基于`LinkedList`实现的队列示例: ```java import java.util.LinkedList; import java.util.Queue...
在Java中,可以使用`java.util.LinkedList`作为队列实现,或者使用`java.util.Queue`接口配合`java.util.ArrayDeque`实现。下面是一个基本的Java代码实现示例: ```java import java.util.*; public class ...