day17 链队列
1. 链队列特点
队列相比于栈,它是两端都可以操作,但队头只能进行出队列,队尾只能进行入队列(就像生活中的排队买东西一样)在删除队列时,需要判断队列是否为空(如下代码:header.next == null)。当对头(header)和队尾(tail)指向同一个节点时,则队列为空 ,所以空队列也需要一个节点
2. 图示
- 创建一个队列
- 结合图去理解代码的入队和出队就很好理解。
## 代码
- 队列判空 头指针和尾指针指向相等 header == tail
package datastructure.queue;
public class LinkedQueue {
class Node{
/**
* The data
*/
int data;
/**
* The reference to the next node
*/
Node next;
/**
* The constructor
* @param paraValue The data
*/
public Node(int paraValue){
data = paraValue;
next = null;
}
}
/**
* The header of the queue
*/
Node header;
/**
* The tail of the queue
*/
Node tail;
/**
* Construct an empty sequential list.
*/
public LinkedQueue(){
header = new Node(-1);
tail = header;
}
/**
* Enqueue
* @param paraValue The value of the new node.
*/
public void enqueue(int paraValue){
Node tempNode = new Node(paraValue);
tail.next = tempNode;
tail = tempNode;
}
/**
* Dequeue
* @return The value at the header.
*/
public int dequeue(){
if (header == tail){
System.out.println("No element in the queue");
return -1;
}
int resultValue = header.next.data;
header.next = header.next.next;
// The queue becomes empty.
if (header.next == null){
tail = header;
}
return resultValue;
}
/**
* Overrides the method claimed in Object, the superclass of any class.
* @return
*/
@Override
public String toString(){
String resultString = "";
if (header.next == null){
return "empty";
}
Node tempNode = header.next;
while (tempNode != null){
resultString += tempNode.data + ", ";
tempNode = tempNode.next;
}
return resultString;
}
public static void main(String[] args) {
LinkedQueue tempQueue = new LinkedQueue();
System.out.println("Initialized, the list is: " + tempQueue.toString());
for (int i = 0; i < 5; i++) {
tempQueue.enqueue(i + 1);
}
System.out.println("Enqueue, the queue is: " + tempQueue.toString());
tempQueue.dequeue();
System.out.println("Dequeue, the queue is: " + tempQueue.toString());
int tempValue;
for (int i = 0; i < 5; i++) {
tempValue = tempQueue.dequeue();
System.out.println("Looped delete " + tempValue + ", the new queue is: " + tempQueue.toString());
}
for (int i = 0; i < 3; i++) {
tempQueue.enqueue(i + 10);
}
System.out.println("Enqueue, the queue is: " + tempQueue.toString());
}
}