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());
}
}
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());
}
}
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()); } }