数据结构(Java语言)——Queue简单实现

和栈类似,队列queue也是表。然而,使用队列时插入在一端进行而删除在另一端进行。

队列的基本操作是enqueue(入队)和dequeue(出队),入队是在队尾rear(表的末端)插入一个元素,出队是删除在队头front(表的开头)的元素。

和栈一样,对于队列而言任何表的实现都可以,而且对于每种操作,链表实现和数组实现都是快速的O(1)时间。下面主要讨论队列的循环数组实现。

对于每一个队列数组结构,我们保留一个数组theArray[]以及位置front和rear,它们表示队列的两端。我们还要记录实际存在于队列中的元素个数currentSize。为使一个元素x入队,我们执行enqueue()使currentSize和rear增1,然后置theArray[rear]=x。为使元素出队列,我们置返回值为theArray[front],并且currentSize减1,然后使front加1。以下是相关代码实现:

import java.util.Iterator;
import java.util.NoSuchElementException;

public class MyQueue<AnyType> implements Iterable<AnyType> {
	private static final int DEFAULT_CAPACITY = 10;
	private AnyType[] theArray; // 以数组存放数据
	private int currentSize; // 当前队列的长度,非数组长度
	private int front; // 队头
	private int rear; // 队尾

	/**
	 * 构造函数自动执行clear()函数
	 */
	public MyQueue() {
		clear();
	}

	/**
	 * 分配内存,初始化各成员变量
	 */
	public void clear() {
		ensureCapacity(DEFAULT_CAPACITY);
		currentSize = 0;
		front = rear = 0;
	}

	/**
	 * 返回当前数组长度
	 *
	 * @return 数组长度
	 */
	public int size() {
		return theArray.length;
	}

	/**
	 * 当前队列是否满
	 *
	 * @return
	 */
	public boolean isFull() {
		return currentSize == size();
	}

	/**
	 * 当前队列是否空
	 *
	 * @return
	 */
	public boolean isEmpty() {
		return currentSize == 0;
	}

	/**
	 * 根据参数确定数组长度
	 *
	 * @param newCapacity
	 *            新的大小
	 */
	@SuppressWarnings("unchecked")
	public void ensureCapacity(int newCapacity) {
		// 第一次(数组未分配)直接分配内存
		if (theArray == null) {
			theArray = (AnyType[]) new Object[newCapacity];
			return;
		}
		// 参数小于当前长度直接返回
		if (newCapacity < size()) {
			return;
		}
		// 数组扩充时将原数据复制到新分配的数组里
		AnyType[] old = theArray;
		theArray = (AnyType[]) new Object[newCapacity];
		for (int i = front; i < front + old.length; i++) {
			theArray[i - front] = old[i % old.length];
		}
		// 重新赋值各变量
		front = 0;
		rear = old.length - 1;
		currentSize = old.length;
	}

	/**
	 * 入队操作
	 *
	 * @param value
	 *            入队元素
	 */
	public void enqueue(AnyType value) {
		// 检查队列是否满
		if (isFull()) {
			ensureCapacity(size() * 2);
		}
		// 第一次入队时队尾无数据,直接赋值。之后队尾先加一取余再赋值
		if (theArray[rear] != null) {
			rear = (rear + 1) % size();
		}
		theArray[rear] = value;
		currentSize++;
	}

	/**
	 * 出队操作
	 *
	 * @return 出队元素
	 */
	public AnyType dequeue() {
		// 若队列空则无法出队
		if (isEmpty()) {
			throw new NullPointerException();
		}
		// 出队操作
		currentSize--;
		AnyType value = theArray[front];
		theArray[front] = null;
		front = (front + 1) % size();
		return value;
	}

	/**
	 * 实现Iterable接口
	 */
	public Iterator<AnyType> iterator() {
		return new QueueIterator();
	}

	private class QueueIterator implements Iterator<AnyType> {

		private int current = 0;

		public boolean hasNext() {
			return current < size();
		}

		public AnyType next() {
			if (!hasNext()) {
				throw new NoSuchElementException();
			}
			return theArray[current++];
		}

	}

	public static void main(String[] args) {
		MyQueue<Integer> queue = new MyQueue<Integer>();
		Iterator<Integer> iterator1 = queue.iterator();
		Iterator<Integer> iterator2 = queue.iterator();
		queue.enqueue(1);
		queue.enqueue(2);
		queue.enqueue(3);
		queue.enqueue(4);
		queue.enqueue(5);
		queue.enqueue(6);
		queue.enqueue(7);
		queue.enqueue(8);
		queue.enqueue(9);
		queue.enqueue(10);
		queue.dequeue();
		queue.dequeue();
		queue.dequeue();
		queue.dequeue();
		queue.enqueue(11);
		queue.enqueue(12);
		System.out.println("队列未超出容量时结果:");
		while (iterator1.hasNext()) {
			System.out.print(iterator1.next() + " ");
		}
		System.out.println("\n队列超出容量时结果:");
		queue.enqueue(13);
		queue.enqueue(14);
		queue.enqueue(15);
		while (iterator2.hasNext()) {
			System.out.print(iterator2.next() + " ");
		}
	}
}

执行结果:

队列未超出容量时结果:

11 12 null null 5 6 7 8 9 10

队列超出容量时结果:

5 6 7 8 9 10 11 12 13 14 15 null null null null null null null null null

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-25 18:51:41

数据结构(Java语言)——Queue简单实现的相关文章

二、Java语言的简单认识及Hello World示例

1. Java语言的简单认识 (1) Java有三个版本: a. JAVA SE (以前称J2SE):Standard Environment 标准版本: b. JAVA EE (以前称J2EE):Enterprise Environment 企业版: c. JAVA ME (以前称J2ME):Eicro Environment 微型版; (2) Java的安装目录 在前一讲中,提到安装目录中有两个文件夹,分别是jdk1.7.0_45和jre7.在"jdk1.7.0_45"文件夹的bi

java语言实现简单的洗牌,发牌

java学习过程中,老师让写了个简单的斗地主洗牌发牌的程序,一下就是程序代码: package com.java.lei.homework; import java.util.Arrays; import java.util.Random; public class PokerGame { //1.创建数组,用以存储扑克牌 static String[] pokers = new String[54]; public static void main(String[] args) { //2.创

数据结构(java语言描述)顺序栈的使用(两个大数相加)

利用http://www.cnblogs.com/xleer/p/5289661.html中对顺序栈以及栈的进本方法的定义,实现超过整数上限的两个数的加法计算. 算法: package stack;/********************************************************************** * @author sch ********利用栈,计算两个大数的和.大数的值超过int存储的范围******************************

java语言实现简单接口工具--粗简版

2016注定是变化的一年,忙碌.网红.项目融资失败,现在有点时间整整帖子~~ 目标: 提高工作效率与质量,能支持平台全量接口回归测试与迭代测试也要满足单一接口联调测试. 使用人员: 测试,开发 工具包目录: 使用: 1.填写测试案例 2.修改执行配置文件 3.执行jar类 工具进阶: 粗简版 :实现加密解密封装,满足迭代接口自定义参数测试工作: 简单版:实现接口返回值校验:满足平台全量接口回归校验检查,生成测试报告: demo公开版:实现web界面自定义参数设置.测试计划设置.测试案例维护,测试

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

数据结构(java语言描述)递归实现——汉诺塔问题

1.汉诺塔问题描述 N阶汉诺塔:假设有3个分别命名为x,y,z的三个塔座,在x上有n个盘子,直径大小不同,有小到大按标号1,2,3...n排列,要借助y将n个盘子转移到z上,期间不能让小盘子压在大盘子上.规则: 每次至移动一个盘子: 盘子可以插在x,y,z任意一个塔座上: 任何时候都不能将大盘压在小盘上. 2.解题思路 当n=1时,直接把盘子由x——>z; 当n>1时,需利用y,首先将(n-1)个盘子由x——>y,把第n个实现x——>z,然后把问题转换为实现(n-1)个盘子由y——

数据结构(java语言描述)哈夫曼编码

原理:哈夫曼编码是根据将已给出的权值作为叶子结点,生成一颗哈夫曼树,然后使得权重最小. 首先生成已给权重的所有的叶子结点,然后取所有节点中最小和次小的结点作为左右孩子生成一个哈夫曼树,计算出父节点的权重放入给出的权重森林中,并把之前的最小和次小的结点从森林中删除,再在种种森林中找最小和次小的结点生成权重树....直到最终只剩下一个树为止. 哈夫曼树的结点用如下结点表示: (有权重,左右孩子,父节点,然后设置一个标识符标志结点是否已经放入哈夫曼树) package tree;/**********

JAVA语言学校的危险性

Java语言学校的危险性(译文) 作者: 阮一峰 日期: 2008年12月 7日 下面的文章是More Joel on Software一书的第8篇. 我觉得翻译难度很大,整整两个工作日,每天8小时以上,才译出了5000字.除了Joel大量使用俚语,另一个原因是原文涉及"编程原理",好多东西我根本不懂.希望懂的朋友帮我看看,译文有没有错误,包括我写的注解. ==================== 作者:Joel Spolsky 译者:阮一峰 原文: http://www.joelon

java语言的特性及应用

java语言定义: Java是一种可以撰写跨平台应用程序的面向对象的程序设计语言. Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算机.移动电话和互联网,同时拥有全球最大的开发者专业社群. 组成: Java由四方面组成:●Java编程语言,即语法.●Java文件格式,即各种文件夹.文件的后缀.●Java虚拟机(JVM),即处理*.class文件的解释器.●Java应用程序接口(Java API). Java分为三个体系,分别为Java

java语言具备的11大特点

中软国际武汉java培训专家介绍java语言具备的11大特点. 1.Java语言是简单的 Java 语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用Java.另一方面,Java丢弃了C++中很少使用的.很难理解的.令人迷惑 的那些特性,如操作符重载.多继承.自动的强制类型转换.特别地,Java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧. 2.Java语言是一个面向对象的 Java 语言提供类.接口和继承等原语,为了简单起见,只支持类之间的单继承,