一、队列概述
队列是一种先入先出(FIFO 即 first input first output)的数据结构
在FIFO数据结构中,首先处理添加到队列中的第一个元素
如上图所示
新的元素会被插入在队列的末尾,该操作被称为“入队”(enqueue),即插入(insert)操作
删除元素时只能删除队列的第一个元素,该操作被称为“出队”(dequeue),即删除(delete)操作
二、操作实现
1.基本队列的实现
类型 | 描述 |
enqueue(方法) | 向队列末尾添加一个元素 |
dequeue(方法) | 删除队列第一个元素 |
front(方法) | 读取队列第一个元素,仅返回头元素,不删除 |
back(方法) | 读取队列尾的元素 |
toString(方法) | 显示队列所有的元素 |
clear(方法) | 清空当前队列 |
empty(方法) | 判断队列是否为空 |
<1>定义一个队列
//定义一个队列
function Queue(){
this.dataStore = [];
this.enqueue = enqueue; //入队
this.dequeue = dequeue; //出队
this.front = front; //查看队首元素
this.back = back; //查看队尾元素
this.toString = toString; //显示队列所有元素
this.clear = clear; //清空当前队列
this.empty = empty; //判断当前队列是否为空
}
<2>判断一个队列是否为空
//通过判断dataStore的长度可以判断当前队列是否为空
function empty(){
if(this.dataStore.length===0){
return true
}else{
return false
}
}
<3>向队列末尾添加一个元素
//向队列末尾添加一个元素,调用push方法
function enqueue(element){
this.dataStore.push(element)
}
<4>删除队列第一个元素
//删除队列第一个元素,调用shift方法
function dequeue(){
if(this.empty()){
return 'this queue is empty'
}else{
this.dataStore.shift()}
}
<5>查看队首元素
//查看队首元素,返回数组第一个元素
function front(){
if(this.empty()){
return 'this queue is empty'
}else{
return this.dataStore[0]
}
}
<6>查看队尾元素
//查看队尾元素,返回数组最后一个元素
function back(){
if(this.empty()){
return 'this queue is empty'
}else{
return this.dataStore[this.dataStore.length-1]
}
}
<7>查看队列中所有元素
//查看队列中所有元素,调用join方法
function toString(){
return this.dataStore.join('\n')
}
<8>清空当前队列
//清空当前队列
function clear(){
delete this.dataStore
this.dataStore = []
}
*现在来测试一下以上功能:
var queue = new Queue()
console.log(queue.empty()) //true
//添加几个元素
queue.enqueue('元素1')
queue.enqueue('元素2')
queue.enqueue('元素3')
console.log(queue.dataStore) //["元素1", "元素2", "元素3"]
//查看队首元素
console.log(queue.front()) //元素1
//查看队尾元素
console.log(queue.back()) //元素3
//删除队首元素
queue.dequeue()
//查看队列中所有元素
console.log(queue.toString()) //元素2 元素3
//清空当前队列
queue.clear()
console.log(queue.empty()) //true
2.优先队列的实现
在优先队列当中,元素的插入和删除是基于优先级的,实现优先队列有两种方式,分别是“优先添加,正常出列”和“正常添加,优先出列”
“优先添加,正常出列”会在实现队列的基础上将添加进队列的元素由普通的数据改为对象类型,这个对象就包含了元素的值和优先级
function PriorityQueue() {
var items = [];
//需要插入队列的元素(该元素为对象,包括值和优先级)
function QueueElement(element, priority) {
this.element = element;
this.priority = priority;
}
//插入元素到队列中的方法
this.enqueue = function (element, priority) {
//需要插入队列的元素
var queueElement = new QueueElement(element, priority);
if(this.isEmpty()) {
//当队列为空时,直接往队列中添加元素
items.push(queueElement);
}else{
//当队列不为空时,遍历队列中的元素,当需要添加的元素的优先级小于(队列中)当前元素的优先级,就把该元素插入到当前元素之前
var added = false;
for(var i = 0; i < items.length; i++){
if(queueElement.priority < items[i].priority) {
items.splice(i, 0, queueElement);
added = true;
break;//终止队列循环
}
}
//当需要添加的元素的优先级比队列中任何一个元素的优先级都要高时,把该元素插入到队列的末尾
if(!added){
items.push(queueElement);
}
}
}
//查看队列是否为空,如果为空,返回true;否则返回false
this.isEmpty = function() {
return items.length == 0;
}
//查看队列
this.print = function() {
return items;
}
}
var priorityQueue = new PriorityQueue();
priorityQueue.enqueue('a', 10);
priorityQueue.enqueue('this', 2);
priorityQueue.enqueue('is', 8);
priorityQueue.enqueue('good', 20);
priorityQueue.enqueue('example', 20);
console.log(priorityQueue.print());