数据结构——队列的java实现(三)-使用单向链表以及实现
程序员文章站
2024-02-11 21:21:16
...
队列的链式存储结构及实现
定义:队列的链式存储结构
,其实就是线性表的单链表
,只不过,它只能尾进头出
。我们把它简称为链队列
。
队头指针
指向链队列的头结点
,队尾指针
指向链队列的终端节点
。
当队列为空时,front
和rear
都指向头结点
,如图:
队列的链式存储结构-入队操作:
入队操作其实就是在链表尾部插入节点
:
代码实现:
Queue.class
package code.ArrayCode;
public interface Queue<E> {
int getSize();
boolean isEmpty();
void enqueue(E e);
E dequeue();
E getFront();
}
LinkedListQueue.class
package code.LinkedListCode;
import code.ArrayCode.Queue;
public class LinkedListQueue<E> implements Queue<E> {
public class Node{
public E e;
public Node next;
public Node(E e, Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e, null);
}
public Node(){
this(null,null);
}
@Override
public String toString(){
return e.toString();
}
}
private Node head, tail;
private int size;
public LinkedListQueue(){
head = null;
tail = null;
size = 0;
}
public int getSize() {
return size;
}
public boolean isEmpty() {
return size ==0;
}
public void enqueue(E e) {
if(tail == null){
tail = new Node(e);
head = tail;
}else {
//创建一个新的节点Node,然后tail.next指向这个新的节点,
// 接着把tail设置成Node.next,维护tail指针的位置
tail.next = new Node(e);
tail = tail.next;
}
size++;
}
public E dequeue() {
if (isEmpty()) {
throw new IllegalArgumentException("Cannot dequeue from an empty queue.");
}
//retNode节点也就是出队元素所在节点应该是head这个位置所指的节点
//retNode指向头节点head的下一个节点
Node retNode = head;
//新的head直接跳过retNode指向head的下一个节点
head = head.next;
//新的head为原来head的下一个节点,原来head为retNode
retNode.next = null;
//如果head下一个节点为null,则tail也为null
if(head == null){
tail = null;
}
return null;
}
public E getFront() {
if (isEmpty()) {
throw new IllegalArgumentException("Queue is empty.");
}
return head.e;
}
@Override
public String toString(){
StringBuilder res = new StringBuilder();
res.append("Queue: front ");
Node cur = head;
while (cur != null){
res.append(cur + "->");
cur = cur.next;
}
res.append("NULL tail");
return res.toString();
}
}
Main.class
public static void main(String[] args) {
LinkedListQueue<Integer> queue = new LinkedListQueue<Integer>();
for(int i =0 ; i < 10 ; i++){
queue.enqueue(i);
System.out.println(queue);
if(i % 3 ==2){
queue.dequeue();
System.out.println(queue);
}
}
}
测试结果:
Queue: front 0->NULL tail
Queue: front 0->1->NULL tail
Queue: front 0->1->2->NULL tail
Queue: front 1->2->NULL tail
Queue: front 1->2->3->NULL tail
Queue: front 1->2->3->4->NULL tail
Queue: front 1->2->3->4->5->NULL tail
Queue: front 2->3->4->5->NULL tail
Queue: front 2->3->4->5->6->NULL tail
Queue: front 2->3->4->5->6->7->NULL tail
Queue: front 2->3->4->5->6->7->8->NULL tail
Queue: front 3->4->5->6->7->8->NULL tail
Queue: front 3->4->5->6->7->8->9->NULL tail