算法通关村第五关——青铜挑战笔记
前言
全文代码均以Java语言复现,主要为自己学习做记录,如有问题,还请各位大佬们指点指点。
这篇讲解线性表(队列)创建和基本操作。
基于链表的构建,直接在队尾添加一个节点,相当于单链表的尾插法。
队列的基础知识
-
特性:
- 先进先出(FIFO): 队列中的元素按照它们进入队列的顺序被移除,最早进入的元素首先被移除。
- 后进后出(LIFO): 与栈(Stack)不同,队列是先进先出的数据结构,不支持后进先出的操作。
-
队列的实现:
队列可以用数组或链表来实现。常见的队列实现包括数组队列(Array Queue)、链表队列(Linked List Queue)以及优先级队列(Priority Queue)等。 -
基本操作:
- enqueue:也称为入队操作,将元素添加到队列的末尾。
- dequeue:也称为出队操作,从队列的头部移除并返回一个元素。
- peek:查看队列的头部元素,但不进行出队操作。
队列实现
public class LinkQueue {
// 队头
private Node front;
// 队尾
private Node rear;
// 队列长度
private int size;
public LinkQueue(){
// 初始化都在队首
this.front = new Node(0);
this.rear = new Node(0);
}
// 静态内部类
// 更好的添加功能
static class Node {
public int data;
public Node next;
public Node(int data){
this.data = data;
}
}
/**
* 入队
* 使用到rear(Node)节点
* @param value
*/
public void push(int value){
Node newNode = new Node(value);
Node temp = front;
while(temp.next!=null){
temp=temp.next;
}
temp.next=newNode;
// 移动rear指针到队尾
rear = newNode;
size++;
}
/**
* 遍历队列
*/
public void traverse(){
Node temp = front.next;
while(temp!=null){
System.out.println(temp.data+"\n");
temp=temp.next;
}
}
/**
* 出队
* @return
*/
public int pull(){
// 判断有无队空
if(front.next==null){
System.out.println("队空");
return -1;
}
Node temp = front.next;
front.next=temp.next;
size--;
return temp.data;
}
}
总结
- 其实本质就是单链表,只是增删改查的基本操作根据队列的FIFO的特性进行的
- 在Java中我们可以直接是用Queue类,节省自己独立封装的Queue类。