使用数组来实现循环队列
队列
我们知道,在计算机科学中,程序本质上就是数据结构加上算法。数据结构是计算机存储、组织数据的方式。一般来讲,数据结构按照数据的逻辑结构分为线性结构和非线性结构两种。几乎所有的线性结构都是建立在两种最基本的结构上的:内存中连续存储的数组结构以及内存中分散存储的链表结构。
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列是先进先出的线性结构,而栈(stack)是先进后出的线性结构。
队列作为一种线性结构,既可以使用数组来实现,也可以用链表进行实现,本文就用Java语言以数组为基础完成一个循环队列的实现。
队列的接口
基于队列的特点,我们简单的为我们的队列创建一个接口,规定该队列需要实现的方法。
package com.hebin.datastructure.queue;
public interface IQueue {
public void add(int a);
public int get();
public void show();
}
我们创建的是一个存储int数字的队列,需要有从后端增加数字、从前端取出数字,查看队列元素等方法。
循环队列的实现
分析队列和数组的特点,我们知道,数组是无法变更大小的,并且数组元素下标必须从0开始,最大不能大于(数组数量-1)。
/**
* 使用数组来实现循环队列,队列本质上是一个数组。
* 队列的特点是先进先出,后进后出;增加元素添加到队列尾部,取出元素从头部获取。
*/
public class MyArrayQueue implements IQueue {
// 队列的最大容量
private int maxSize;
// 循环队列的当前容量size;
private int size;
//循环队列的队头坐标,每次取出数据,该标志位向后移动一位,位于数组尾部时,移动到数组头部
private int front;
//循环队列的队尾坐标,每次增加数据,该标志位向后移动一位,位于数组尾部时,移动到数组头部
private int end;
// 队列的本体,是一个数组
private int[] array;
/**
* 队列的构造函数
* @param maxSize 指定队列的最大元素个数
*/
public MyArrayQueue(int maxSize) {
// 队列的初始大小为0
this.size = 0