队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
队列的存储结构及实现
队列的顺序存储结构
(1) 顺序队列的定义:
队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。
(2)顺序队列的表示:
和顺序表一样,顺序队列利用内存中一段连续的存储空间来存放当前队列中的元素。
由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素,它们的初值在队列初始化时均应置为0。
放上网上找的一张图更为清晰,这里队尾指针指向的an还没有进队,因为在入队列时尾指针向的是队列的下一个结点,即这个结点还不是队列的元素
我还是用的数组去实现了顺序队列的数据结构
<pre name="code" class="java">package com.gaorui.Stack;
public class ArrayQueue {
private int DEFAULT_SIZE = 10;// 默认大小
private int ArraySize;//队列元素大小
private Object[] elementData;// 定义一个数组用于保存顺序队列的元素
private int front;// 队头
private int rear;// 队尾
// 1.0 构造方法初始化空队列
public ArrayQueue() {
ArraySize = DEFAULT_SIZE;
elementData = new Object[ArraySize];
}
/**1.2构造方法初始化空队列
* 以指定长度的数组来创建顺序队列
*
* @param element
* 指定顺序队列中第一个元素
* @param initSize
* 指定顺序队列底层数组的长度
*/
public ArrayQueue(Object data, int ArraySize) {
this.ArraySize = ArraySize;
elementData = new Object[ArraySize];
elementData[0] = data;
rear++;
}
// 入队
public void offer(Object data) {
elementData[rear++] = data;//当新元素入队,赋值给当前队尾指针指向的域,然后队尾指针+1,队尾指针指向下一个即将入队的新元素。
}
// 出队,并删除队头元素
public Object poll() {
if (isEmpty()) {
return "null";
}
Object data = elementData[front++];//Object类型对象保存队头元素,队头指针++后移一位
elementData[front-1] = null;//因为队头指针后++ 已经向后移了一位,所以需要-1向前移动一位将值清空
return data;
}
//返回队列顶元素,但不是出队
public Object peek(){
if (isEmpty()) {
return "null";
}
Object data = elementData[front];
return data;
}
//对头指针和队尾指针重合,则证明队列此时为null
public boolean isEmpty() {
return rear == front;
}
//获取队列大小
public int getArrayQueueSize(){
return rear-front;
}
/**
* Test
* @param
* @author JavaGR_ais
*/
public static void main(String[] args) {
ArrayQueue aq = new ArrayQueue();
aq.offer(1);
aq.offer(2);
aq.offer(3);
System.out.println(aq.getArrayQueueSize()+"栈顶元素"+aq.peek());
aq.poll();
System.out.println(aq.poll()+"出队");
aq.offer(5);
System.out.println(aq.getArrayQueueSize()+"栈顶元素"+aq.peek());
System.out.println(aq.poll());
}
}