队列的链表实现
程序员文章站
2024-03-18 11:13:10
...
前面我们看了队列的数组实现,本文来看看用链表实现队列的方法。
链式队列的出现:存储队列元素的数组大小是固定的,另外,队列的数组实现需要用特殊的方式处理数组(保留一个数组元素用
于判断数组是否已满),以及索引front和rear(计算front/rear时用(front/rear + 1 )% maxSize 操作)。而队列
的链表实现简化了数组实现的许多特殊情况,并且动态分配内存,所以队列永远也不会满。
看以下程序:
/** 链表类 */
class Link{
/** 结点类,用于初始化结点 */
class Entry{
int data;
Entry next;
public Entry(){
data = -1;
next = null;
}
public Entry(int data){
this.data = data;
next = null;
}
}
/** 定义头尾索引 */
public Entry front = null;
public Entry rear = null;
public int usedSize = 0;
/** 判断队列是否为空 */
public boolean isEmpty(){
return usedSize == 0;
}
/** 插入元素 */
public void insetTail(int data) {
// 若此时队列为空,则直接插入,头尾索引指向该结点
if (isEmpty()) {
rear = new Entry(data);
front = rear;
// 若队列不为空则尾索引后移指向新结点
} else {
rear.next = new Entry(data);
rear = rear.next;
}
// 已用长度每次加1
usedSize++;
}
/** 数据出队列操作 */
public void pop(){
// 若队列为空则直接结束该操作
if(isEmpty()){
return;
}
// 若不为空则头索引指向第二个结点
Entry cur = front;
front = front.next;
// 第一个结点置为null,便于垃圾回收
cur.next = null;
// 已用长度每次减1
usedSize--;
}
/** 获取队列头元素操作 */
public int getTop(){
// 若队列为空则返回-1
if (isEmpty()){
return -1;
}
// 若不为空则返回头索引对应的结点数据
return front.data;
}
/** 队列元素的遍历输出 */
public void print(){
Entry cur = front;
while (cur != null){
System.out.print(cur.data + " ");
cur = cur.next;
}
System.out.println();
}
}
/** 主类*/
public class LinkQueue {
public static void main(String[] args){
// 动态制作一个链式队列
Link link = new Link();
for (int x = 0; x < 5; x++){
link.insetTail(x);
}
System.out.print("队列里的元素是:");
link.print();
System.out.println("队列头元素是 :"+ link.getTop());
System.out.println("队列长度是 :" + link.usedSize);
System.out.println("==================" );
link.pop();
System.out.print("执行一次出队操作后队列里的元素是:");
link.print();
System.out.println("执行一次出队操作后队列头元素是 :"+ link.getTop());
System.out.println("执行一次出队操作后队列长度是 :" + link.usedSize);
}
}
以上程序的输出结果是:
队列里的元素是:0 1 2 3 4
队列头元素是 :0
队列长度是 :5
==================
执行一次出队操作后队列里的元素是:1 2 3 4
执行一次出队操作后队列头元素是 :1
执行一次出队操作后队列长度是 :4
下一篇: 模拟队列