1.队列的概念和基本特征
队列的特点是其节点的排序次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)。
队列的实现方法有两种形式,分别基于数组和链表。对于链表,因为链表的长度是随时可以改变的,实现起来就比较简单。但是对于数组而言,长度是固定的(对于单一数组而言),对于增删操作的实现就比较困难。因此,本节仅讨论基于链表实现队列的方法(使用数组实现的方法应该会在之后文章进行讲解)。
2. 实现队列
基于链表实现队列相对来说,还是比较好理解的,只要在链表尾部插入元素,在front后删除元素即可。
代码如下(附注释):
package com.yugutou.charpter5_queue_map.level1;
import java.util.Date;
public class LinkQueue {
private Node front; //front作为虚拟头结点
private Node rear; //rear锁定队列尾结点
private int size = 0;//队列长度
//初始化队列的头结点,尾结点为0
LinkQueue(){
front = new Node(0);
rear = new Node(0);
}
/**
* 入队
*/
public void push(int value) {
Node node = front;//获取头结点,方便遍历
//遍历获取当前队列尾结点
while (node.next != null){
node = node.next;
}
Node temp = new Node(value);
node.next = temp;//将新结点插入到链表尾部
rear = temp;//rear保存新链表尾结点
size++;//记录新链表长度
}
/**
* 出队
*/
public int pull() {
if (front.next == null){ //判断当前链表是否为空
System.out.println("该队列为空");
}
//不为空,则在front后插入新结点
Node firstNode = front.next;
front.next = firstNode.next;
size--;//记录新链表长度
return firstNode.data;//返回删除结点的值
}
/**
* 遍历队列
*/
public void traverse() {
Node temp = front.next;
//依次遍历,输出各结点
while (temp != null){
System.out.println(temp.data + "\t");
temp = temp.next;
}
}
//初始化各结点
static class Node {
private int data;
private Node next;
public Node(int data) {
this.data = data;
}
}
//测试main方法
public static void main(String[] args) {
LinkQueue linkQueue = new LinkQueue();
linkQueue.push(1);
linkQueue.push(2);
linkQueue.push(3);
linkQueue.push(4);
linkQueue.push(5);
System.out.println("第一个出队的元素为:" + linkQueue.pull());
System.out.println("第二个出队的元素为:" + linkQueue.pull());
System.out.println("队列中的元素为:");
linkQueue.traverse();
}
}