`

请您先登录,才能继续操作

基于数组和链表的队列实现

 
阅读更多

队列接口定义,和栈接口一样:

public interface Queue<Item> {

	/**
	 * 添加一个元素
	 * @param item
	 */
	public void push(Item item);
	
	/**
	 * 获取最后一个添加的元素,并将其从队列中删除
	 * @return
	 */
	public Item pop();
	
	/**
	 * 判断队列是否为空
	 * @return
	 */
	public boolean isEmpty();
	
	/**
	 * 获取队列当前的元素个数
	 * @return
	 */
	public int size();
	
}

基于数组的实现,关键是如何resize:

import java.util.Iterator;

import com.mycode.algorithms.stack.Stack;

/**
 * 基于数组的队列实现
 * @author imhuqiao
 */
public class ArrayQueue<Item> implements Queue<Item>,Iterable<Item> {

	private Item[] data = null;
	private int tail = -1;
	private int head = -1;
	private int count = 0;
	
	public ArrayQueue(){
		this(10);
	}
	
	public ArrayQueue(int initLength){
		data = (Item[]) new Object[initLength];
	}
	
	@Override
	public void push(Item item) {
		if(size()==data.length){
			resize(data.length*2);
		}
		data[++tail] = item;
		if(head==-1){
			head = 0;
		}
		count++;
		print();
	}
	
	@Override
	public Item pop() {
		if(isEmpty()){
			return null;
		}
		Item item = data[head];
		data[head] = null;
		head++;
		if(size() > 0 && size() == data.length/4) resize(data.length/2);
		print();
		count--;
		return item;
	}
	
	private void print(){
		System.out.print("[");
		for(Item d : data){
			System.out.print(d+",");
		}
		System.out.println("],tial="+tail+",head="+head);
	}


	@Override
	public boolean isEmpty() {
		return size()==0;
	}

	@Override
	public int size() {
		return count;
	}

	@Override
	public Iterator<Item> iterator() {
		return new ArrayStackIterator();
	}
	
	
	private void resize(int length){
		Item[] newdata = (Item[]) new Object[length];
		int x = 0;
		//System.out.println("resize from "+ size()+" to "+length);
		for(int i = head;i<=tail;i++){
			newdata[x++] = data[i];
			data[i] = null;
		}
		data = newdata;
		head = 0;
		tail = x==0 ? x : x-1;
	}
	
	class ArrayStackIterator implements Iterator<Item>{
		private int i = tail;
		private int j = head;
		@Override
		public boolean hasNext() {
			return i>=j;
		}

		@Override
		public Item next() {
			Item result = data[j++];
			return result;
		}

		@Override
		public void remove() {
			
		}
	}
}


基于链表的实现,原理和栈一致,只是多了一个记录尾部的变量,push的时候不是替换头而是接在尾巴上:

import java.util.Iterator;

import com.mycode.algorithms.stack.Stack;

/**
 * 基于数组的队列实现
 * @author imhuqiao
 */
public class ArrayQueue<Item> implements Queue<Item>,Iterable<Item> {

	private Item[] data = null;
	private int tail = -1;
	private int head = -1;
	private int count = 0;
	
	public ArrayQueue(){
		this(10);
	}
	
	public ArrayQueue(int initLength){
		data = (Item[]) new Object[initLength];
	}
	
	@Override
	public void push(Item item) {
		if(size()==data.length){
			resize(data.length*2);
		}
		data[++tail] = item;
		if(head==-1){
			head = 0;
		}
		count++;
		print();
	}
	
	@Override
	public Item pop() {
		if(isEmpty()){
			return null;
		}
		Item item = data[head];
		data[head] = null;
		head++;
		if(size() > 0 && size() == data.length/4) resize(data.length/2);
		print();
		count--;
		return item;
	}
	
	private void print(){
		System.out.print("[");
		for(Item d : data){
			System.out.print(d+",");
		}
		System.out.println("],tial="+tail+",head="+head);
	}


	@Override
	public boolean isEmpty() {
		return size()==0;
	}

	@Override
	public int size() {
		return count;
	}

	@Override
	public Iterator<Item> iterator() {
		return new ArrayStackIterator();
	}
	
	
	private void resize(int length){
		Item[] newdata = (Item[]) new Object[length];
		int x = 0;
		//System.out.println("resize from "+ size()+" to "+length);
		for(int i = head;i<=tail;i++){
			newdata[x++] = data[i];
			data[i] = null;
		}
		data = newdata;
		head = 0;
		tail = x==0 ? x : x-1;
	}
	
	class ArrayStackIterator implements Iterator<Item>{
		private int i = tail;
		private int j = head;
		@Override
		public boolean hasNext() {
			return i>=j;
		}

		@Override
		public Item next() {
			Item result = data[j++];
			return result;
		}

		@Override
		public void remove() {
			
		}
	}
}

测试代码:

	@Test
	public void testArrayQueue(){
		Queue<String> as = new ArrayQueue<String>(1);
		as.push("a");
		as.push("b");
		as.push("c");
		as.push("d");
	    as.push("e");
		Assert.assertEquals("a",as.pop());
		Assert.assertEquals("b",as.pop());
		String res = "";
		for(String str : as){
			res += str;
		}
		Assert.assertEquals("cde",res);
	}

	@Test
	public void testLinkQueue(){
		Queue<String> as = new LinkQueue<String>();
		as.push("a");
		as.push("b");
		as.push("c");
		as.push("d");
	    as.push("e");
		Assert.assertEquals("a",as.pop());
		Assert.assertEquals("b",as.pop());
		String res = "";
		for(String str : as){
			res += str;
		}
		Assert.assertEquals("cde",res);
	}



分享到:
评论

相关推荐

    数组和链表的对比分析 数组和链表.docx

    与基于数组的实现相比,链表中的元素在逻辑上是相邻的,但在物理位置上不一定相邻。这使得链表具有更高的灵活性,特别是在插入和删除操作方面: - **插入和删除操作**:链表可以在O(1)的时间内完成插入或删除操作,...

    array-doubly-linked-lru.rar_动态数组_基于数组的LRU队列

    总的来说,这个"array-doubly-linked-lru.rar"文件中的实现展示了如何用动态数组和双向链表来构建一个基于数组的LRU队列。这种实现方式虽然简单,但在某些场景下仍能提供良好的性能,尤其是当数据访问模式较为均匀且...

    java数组和链表数据结构的区别 数组和链表.pdf

    - **链表适合**:如果需要频繁地插入和删除元素,或者数据的大小需要动态调整,而对随机访问要求不高的情况下,链表更为合适,例如实现LRU缓存淘汰策略、实现队列和栈等。 总的来说,选择数组还是链表取决于具体的...

    c++链表队列的实现

    虽然题目要求分析链表队列的实现,但给定的代码片段实际上是实现了基于数组的优先队列,而不是链表队列。这里简单分析一下这段代码的主要部分: #### 1. 基础函数定义 - `FixUp`: 调整堆使之满足大顶堆的性质。 - ...

    基于JAVA实现的常用数据结构代码,JAVA实现复杂度、动态数组、链表、栈、队列、二叉搜索树等

    本压缩包"基于JAVA实现的常用数据结构代码"包含了多个关键的数据结构实现,包括复杂度分析、动态数组、链表、栈、队列以及二叉搜索树。以下是这些数据结构的详细说明: 1. **复杂度**:在计算机科学中,复杂度分为...

    用单链表和队列实现归并排序

    在标题“用单链表和队列实现归并排序”中,我们可以理解到这个实现是利用了链表和队列的数据结构。链表是一种线性数据结构,其中的元素在内存中不是顺序存储的,而是通过指针链接。队列则是一种先进先出(FIFO)的...

    数组的扩容和链表结构.zip

    LinkedList适合实现队列和栈,因为它支持高效的头尾操作。 在实际编程中,我们还应了解如何优化这两种数据结构的使用。例如,可以使用Arrays.copyOf()方法进行数组扩容,以减少不必要的内存拷贝。对于链表,我们...

    Java版数据结构代码,栈,动态数组,队列,链表,二叉树

    在Java中,LinkedList类就是链表的实现,适用于实现队列和栈等数据结构。 5. **二叉树(Binary Tree)**:二叉树是每个节点最多有两个子节点的数据结构,分为左子节点和右子节点。常见的二叉树类型有二叉搜索树、...

    同步java之数组与队列

    这种基于数组的队列虽然在空间效率上比链表实现的队列更优,但在动态扩展时可能涉及数组复制,性能相对较差。 在实际应用中,我们需要根据具体需求选择合适的数据结构。例如,对于大量并发插入和删除的操作,`...

    数据结构:线性表、链表、队列、栈、串

    3. **队列**:队列是一种先进先出(FIFO)的数据结构,分为顺序队列和链式队列。seqQueue.cpp和linkQueue.cpp分别展示了这两种实现。顺序队列基于数组,当队尾达到数组长度时,需要进行队列扩容;链式队列则通过链表...

    [电信优惠套餐推荐系统][数组链表].C.A.0.S.zip

    【电信优惠套餐推荐系统】是基于数组和链表数据结构设计的一种软件系统,它主要用于帮助电信运营商为用户提供个性化的优惠套餐建议。在这个系统中,数组和链表是两种基础且重要的数据组织方式,它们在存储和处理大量...

    顺序队列和链式队列的实现

    顺序队列是一种基于数组的队列实现方式。其主要特点是使用一个数组来存储队列元素,并使用两个指针front和rear来指示队首和队尾的位置。 顺序队列的实现可以使用以下步骤: 1. 定义一个顺序队列类,继承自队列接口...

    链表-使用Python基于链表实现的多种队列数据结构比较.zip

    常见的队列实现有普通队列和循环队列。普通队列使用两个指针分别表示队头(front)和队尾(rear),入队操作发生在队尾,出队操作发生在队头。循环队列则使用一个固定大小的数组,当队列满或空时,通过“环”的概念...

    链表-使用Python基于链表实现队列数据结构.zip

    通过实践和实现这些基本概念,可以更好地理解和运用它们,从而提高代码的效率和可维护性。在Python中,虽然有许多内置的工具可以方便地处理数据,但亲手实现这些核心数据结构有助于提升编程技能。

    CircleQueue_with_array_list.rar_c环形队列_环形缓冲区_环形队列_缓冲 队列

    无论是数组还是链表,环形队列和环形缓冲区都是高效的数据管理工具,对于处理大量数据流或进行多线程通信的系统具有重要意义。通过分析和实践这些代码,我们可以深入理解环形数据结构的原理和优势,并将其应用到实际...

    利用一个链表类实现一个队列类和栈类.rar_栈 链表 c++ _链表 类_链表类_队列 类_队列类

    在提供的“利用一个链表类实现一个队列类和栈类.doc”文档中,可能包含了以下内容:链表类的定义,包括节点结构和链表的基本操作(如初始化、添加节点、删除节点等);栈类的实现,包括压栈和弹栈的方法;队列类的...

    数据结构:链队列

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。在众多的数据结构中,链队列是一种常用且实用的结构,尤其...理解并熟练掌握链队列的原理和实现,对提升编程技能和解决实际问题具有重要意义。

    队列代码 循环数组 自编的

    在本例中,我们使用的是基于数组的循环队列实现。 #### 三、循环队列的优点 1. **高效利用空间**:循环队列能够有效地避免数组中出现的大段空白空间。 2. **减少数据移动**:相比普通的线性队列,在进行元素插入或...

    java队列实现(顺序队列、链式队列、循环队列)

    顺序队列通常是基于数组实现的。在Java中,我们可以使用ArrayList或LinkedList来创建顺序队列。ArrayList是基于动态数组实现的,它提供了快速的随机访问,但插入和删除元素时需要移动后续元素,效率相对较低。...

    基于C语言的数据结构队列模板

    文件"多文件队列模板(钟敏成)"很可能包含了实现这些队列模板的源代码,包括头文件和实现文件。通过阅读和理解这些代码,开发者可以学习到如何在C语言中实现高效、灵活的数据结构,并且能够根据实际需求选择合适的...

Global site tag (gtag.js) - Google Analytics