上文队列的简单实现(一)简单的实现了顺序队列结构,这次是实现简单的链式结构。
代码如下:
package ds.queue;
import ds.linkedlist.LinkedList;
public class Queue2<E> {
private LinkedList<E> head = null;// 指向队列头的引用
private LinkedList<E> objData = null;// 用于存放队列数据的链表
private int nLen = 0;// 用于表示队列的长度
Queue2() {
objData = new LinkedList<E>();
}
/**
* 获取队列长度
*
* @param queue
* 队列的引用
* @return 队列长度
*/
int getSize(Queue2<E> queue) {
return queue.nLen;
}
/**
* 判断队列是否为空
*
* @param queue
* 队列的引用
* @return 若队列空,则返回true,否则返回false
*/
boolean isEmpty(Queue2<E> queue) {
return (getSize(queue) == 0);
}
/**
* 清空队列,但不释放内存
*
* @param queue
* 队列的引用
*/
void clear(Queue2<E> queue) {
queue.head = null;
queue.nLen = 0;
}
/**
* 清空队列,且释放内存
*
* @param queue
* 队列的引用
*/
void free(Queue2<E> queue) {
if (queue.head == null) {
return;
} else {
queue.head = queue.objData.delete(queue.head,
queue.objData.getHeadInfo(queue.head));
free(queue);
}
clear(queue);
}
/**
* 入队列操作
*
* @param queue
* 队列的引用
* @param eData
* 要压入队列数据
*/
void enter(Queue2<E> queue, E eData) {
queue.head = queue.objData.addEnd(queue.head, eData);
queue.nLen++;
System.out.println(eData + "已入队列");
}
/**
* 出队列操作
*
* @param queue
* 队列的引用
* @return 队列头的数据
*/
E out(Queue2<E> queue) {
E dataTmp = null;
if (isEmpty(queue)) {
System.out.println("队列已空,无法出队列");
return null;
}
dataTmp = queue.objData.getHeadInfo(queue.head);
queue.head = queue.objData.delete(queue.head, dataTmp);
queue.nLen--;
System.out.println(dataTmp + "已出队列");
return dataTmp;
}
/**
* 读取队列头元素(不出队列)
*
* @param queue
* 队列的引用
* @return 队列头的元素
*/
E peek(Queue2<E> queue) {
E dataTmp = null;
if (isEmpty(queue)) {
System.out.println("队列已空,无法读取队列头的元素");
return null;
}
dataTmp = queue.objData.getHeadInfo(queue.head);
System.out.println(dataTmp + "已读取");
return dataTmp;
}
}
测试代码:
package ds.queue;
import java.util.Random;
public class Simple2 {
public static void main(String[] args) {
System.out.println("----新建空队列----");
Queue2<Integer> queue = new Queue2<Integer>();
System.out.println("队列的现有长度:" + queue.getSize(queue));
System.out.println("----测试入队列操作----");
Random random = new Random();
int temp = 0;
for (int i = 0; i < 6; i++) {
temp = random.nextInt(100);
System.out.println("将" + temp + "压入队列");
queue.enter(queue, temp);
}
System.out.println("队列的现有长度:" + queue.getSize(queue));
System.out.println("----测试读取队列顶操作----");
queue.peek(queue);
queue.peek(queue);
System.out.println("队列的现有长度:" + queue.getSize(queue));
System.out.println("----测试出队列操作----");
for (int i = 0; i < 3; i++) {
queue.out(queue);
}
System.out.println("队列的现有长度:" + queue.getSize(queue));
System.out.println("----测试清空队列操作----");
queue.free(queue);
System.out.println("队列的现有长度:" + queue.getSize(queue));
for (int i = 0; i < 3; i++) {
queue.out(queue);
}
}
}
测试结果:
----新建空队列----
队列的现有长度:0
----测试入队列操作----
将87压入队列
87已入队列
将40压入队列
40已入队列
将1压入队列
1已入队列
将98压入队列
98已入队列
将45压入队列
45已入队列
将94压入队列
94已入队列
队列的现有长度:6
----测试读取队列顶操作----
87已读取
87已读取
队列的现有长度:6
----测试出队列操作----
87已出队列
40已出队列
1已出队列
队列的现有长度:3
----测试清空队列操作----
队列的现有长度:0
队列已空,无法出队列
队列已空,无法出队列
队列已空,无法出队列