一、队列基础
1.1定义
队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端(称为rear)进行插入操作,在前端(称为front)进行删除操作。
队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。

添加新元素演示

队列移除元素演示

1.2分类
-
单链队列
单链队列使用链表作为基本数据结构,所以不存在伪溢出的问题,队列长度也没有限制。但插入和读取的时间代价较高
-
循环队列
循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。
-
阵列队列
-
链式队列
用链表来实现也比较简单,与数组实现类似,也是需要2个指针来控制(front和rear)
二、单链队列的实现
从数据存储的角度看,实现队列有两种方式,一种是以数组做基础,一种是以链表做基础,数组是最简单的实现方式,本文以基础的数组来实现队列。 队列的操作包括创建队列、销毁队列、入队、出队、清空队列、获取队头元素、获取队列的长度。 2.1定义队列的方法:
- enqueue 从队尾添加一个元素
- dequeue 从队首删除一个元素
- head 返回队首的元素
- tail 返回队尾的元素
- size 返回队列的大小
- isEmpty 返回队列是否为空
- clear 清空队列
2.2 es6实现
class Queue {
constructor() {
this.items = []; // 存储数据
}
enqueue(item) { // 向队尾添加一个元素
this.items.push(item);
}
dequeue() { // 删除队首的一个元素
return this.items.shift();
}
head() { // 返回队首的元素
return this.items[0];
}
tail() { // 返回队尾的元素
return this.items[this.items.length - 1];
}
size() { // 返回队列的元素
return this.items.length;
}
isEmpty() { // 返回队列是否为空
return this.items.length === 0;
}
clear() { // 清空队列
this.items = [];
}
}
三、循环队列的实现
//循环队列
function Queue(maxSize) {
this.data = new Array(maxSize);
this.front = 0;//头指针
this.rear = 0;//尾指针
this.maxSize = maxSize;
}
//长度
Queue.prototype.length = function(){
return (this.rear-this.front+this.maxSize)%this.maxSize;
}
Queue.prototype.enterQueue = function(data){
if((this.rear+1)%this.maxSize==this.front){
//满
return 1;
}
this.data[this.rear] = data;
this.rear = (this.rear+1)%this.maxSize;
return 0;
}
Queue.prototype.deleteQueue = function(){
if(this.front == this.rear){
//空
return 1;
}
this.front = (this.front+1)%this.maxSize;
return 0;
}
var que = new Queue(10);
que.enterQueue(1);
que.enterQueue(2);
que.enterQueue(3);
que.deleteQueue();
console.info(que.length());
四、链式队列
//节点
function Node(data){
this.data = data;
}
function Queue() {
var node = new Node(null);
this.front = node;
this.rear = node;
}
//长度
Queue.prototype.length = function(){
var length = 0;
var node = this.front;
while(node!=this.rear){
node = node.next;
length++;
}
return length;
}
Queue.prototype.enterQueue = function(node){
node.next = null;
this.rear.next = node;
this.rear = node;
return 0;
}
Queue.prototype.deleteQueue = function(){
var p = this.front.next;
if(this.rear == this.front){
return 1;
}
this.front.next = p.next;
if(this.rear == p){
this.rear = this.front;
}
delete p;
}
var que = new Queue(10);
que.enterQueue(new Node(1));
que.enterQueue(new Node(2));
que.deleteQueue();
console.info(que.lengt