package com.ssm.cts.test;
/**
* CopyRright (c)2018-2028: chanpinxue.cn
* Project: cts
* Module Name: QueueTest
* Comments: 队列
* JDK version used: JDK1.8
* Author: jzh
* Create Date: 2018-12-07
* Modified By: jzh
* Modified Date: 2018-12-07
* Why & What is modified:
* Version: <1.0>
*/
// Queue接口
interface Queue {
// 返回队列的大小
public int getSize();
// 判断队列是否为空
public boolean isEmpty();
// 数据元素e入队
public void add(Object e);
// 队首元素出队
public Object poll() throws QueueEmptyException;
// 取队首元素
public Object peek() throws QueueEmptyException;
}
// QueueEmptyException队列为空时出队或取队首元素抛出此异常
@SuppressWarnings("serial")
class QueueEmptyException extends RuntimeException {
public QueueEmptyException(String err) {
super(err);
}
}
// Queue的顺序存储实现
class QueueArray implements Queue {
//private static final int LEN = 9;// 队列默认大小
public Object[] elements; // 数据元素数组
private int capacity; // 数组的大小elements.length
private int front; // 队首指针,指向队首
private int rear; // 队尾指针,指向队尾后一个位置
public QueueArray(int LEN) {
capacity = LEN + 1;
elements = new Object[capacity];
front = rear = 0;
}
// 返回队列的大小
public int getSize() {
return (rear - front + capacity) % capacity;
}
// 判断队列是否为空
public boolean isEmpty() {
return front == rear;
}
// 数据元素e入队
public void add(Object e) {
if (getSize() == capacity - 1)
expandSpace();
elements[rear] = e;
rear = (rear + 1) % capacity;
}
private void expandSpace() {
Object[] a = new Object[elements.length * 2];
int i = front;
int j = 0;
// 将从front开始到rear前一个存储单元的元素复制到新数组
while (i != rear) {
a[j++] = elements[i];
i = (i + 1) % capacity;
}
elements = a;
capacity = elements.length;
front = 0;
rear = j; // 设置新的队首、队尾指针
}
// 队首元素出队
public Object poll() throws QueueEmptyException {
if (isEmpty()) {
throw new QueueEmptyException("错误:队列为空");
}
Object obj = elements[front];
elements[front] = null;
front = (front + 1) % capacity;
return obj;
}
// 取队首元素
public Object peek() throws QueueEmptyException {
if (isEmpty())
throw new QueueEmptyException("错误:队列为空");
return elements[front];
}
}
public class QueueTest {
// 测试
public static void main(String[] args) {
QueueArray queue = new QueueArray(9);
queue.add("j");
queue.add("z");
queue.add("h");
System.out.println("队列长度:" + queue.getSize());
// 使用 for 循环数组
for (Object obj : queue.elements) {
if (obj != null) {
System.out.print(obj + " ");
}
}
// 使用 foreach 循环数组
for (int i = 0; i < queue.getSize(); i++) {
System.out.print(queue.elements[i] + " ");
}
System.out.println();
// 队首元素出队
Object o = queue.poll();
System.out.println(o);
System.out.println("队列长度:" + queue.getSize());
}
}