包括:
一. 队列的概念
二. 顺序存储结构 和 链式存储结构的 队列的实现
一. 队列的概念
队列即在表的一端进行插入,在表的另一端进行删除。删除的一端称为队头或者队首,插入的一端称为队尾。插入元素称为进队或者入队,删除元素称为出队。特点:先进先出表。队列的存储结构分为顺序存储结构和链式存储结构。
二. 顺序存储结构 和 链式存储结构的 队列的实现
顺序存储结构的队列实现:
需要一个数组 和 两个指针(例如 front 和 rear),利用数组存储所有元素,利用两个指针分别指向队首 和 队尾,为了充分使用空间,一般用环形队列,即把队首和队尾连接起来。当从队尾插入元素的时候, 进行 rear = ( rear + 1 ) % MaxSize; 同样,在队首删除元素的时候,也是 front = ( front + 1) % MaxSize; 此时会发现,队空 和 队满都是 rear == front ,为了区别队空 和 队满,通常 少用一个元素,即 (rear + 1)% MaxSize == front 就认为是 堆满,对空的判断条件还是不变, front == rear。
以下为 顺序存储结构的队列的简易实现:
public class SelfQueueImpl {
private static int dataLength = 2;
public static void main(String[] args) {
SqQueue sqQueue = new SqQueue();
sqQueue.enQueue(1);
sqQueue.enQueue(2);
sqQueue.enQueue(3);
System.out.println(sqQueue.deQueue());
System.out.println(sqQueue.deQueue());
System.out.println(sqQueue.deQueue());
}
static class SqQueue{
private Object data[] = new Object[dataLength];
private int front;
private int rear;
//进队
public void enQueue(Object element){
if(queueIsFull()){
System.out.println("Queue is full, enQueue failed!.");
} else {
data[rear] = element;
rear ++;
resetRear(rear);
System.out.println("enQueue success. data[" + (rear-1) + "] = " + data[rear-1] );
}
}
private void resetRear(int rear) {
if(rear == dataLength){
this.rear = 0;
}
}
private boolean queueIsFull() {
return (rear + 1) % dataLength == front;
}
//出队
public Object deQueue(){
if(queueIsEmpty()){
System.out.println("Queue is empty, deQueue failed!.");
return null;
} else {
Object object = data[front];
front ++;
resetFront(front);
return object;
}
}
private void resetFront(int front) {
if(front == dataLength){
this.front = 0;
}
}
private boolean queueIsEmpty() {
return rear == front;
}
}
}
输出为:
enQueue success. data[0] = 1
Queue is full, enQueue failed!.
Queue is full, enQueue failed!.
1
Queue is empty, deQueue failed!.
null
Queue is empty, deQueue failed!.
null
链表存储结构的队列实现:
对于链表存储结构,就没有循环链表的概念,也没有队满的概念。对于队空,由于队列会维护着 front 和 rear,所以只需要判断其中一个是否为空即可。
以下为 链式存储结构的队列的简易实现:
public class SelfQueueImpl_List {
public static void main(String[] args) {
SqQueue sqQueue = new SqQueue();
sqQueue.enQueue(1);
sqQueue.enQueue(2);
sqQueue.enQueue(3);
System.out.println(sqQueue.deQueue());
System.out.println(sqQueue.deQueue());
System.out.println(sqQueue.deQueue());
System.out.println(sqQueue.deQueue());
}
static class SqQueue{
private QNode front;
private QNode rear;
//进队
public void enQueue(Object object){
if(QueueIsEmpty()){
insert1(object);
} else{
insert2(object);
}
System.out.print("enQueue success. Queue is ");
printQueue();
}
private void printQueue() {
QNode flag = this.front;
while(flag != null ){
System.out.print(" " + flag.getObject());
flag = flag.getNext();
}
System.out.print("\n");
}
private void insert1(Object object) {
QNode qNode = new QNode(object);
this.front = qNode;
this.rear = qNode;
}
private void insert2(Object object) {
rear.setNext(new QNode(object));
rear = rear.getNext();
}
private boolean QueueIsEmpty() {
return this.front == null;
}
//出队
public Object deQueue(){
if(QueueIsEmpty()){
System.out.println("Queue is empty, deQueue failed!.");
return null;
} else {
Object object = front.getObject();
front = front.next;
return object;
}
}
}
static class QNode{
private Object object;
private QNode next;
public QNode(Object object){
this.object = object;
}
public Object getObject(){
return this.object;
}
public QNode getNext(){
return this.next;
}
public void setNext(QNode qNode){
this.next = qNode;
}
}
}
输出为:
enQueue success. Queue is 1
enQueue success. Queue is 1 2
enQueue success. Queue is 1 2 3
1
2
3
Queue is empty, deQueue failed!.
null
下一篇再介绍 Java 的队列体系结构。
参考:java Queue中 remove/poll, add/offer, element/peek区别