1、前言
队列是一种先进先出(First-In-First-Out,FIFO)的数据结构。队列被用在很多地方,比如提交操作系统执行的一系列进程、打印任务池等,一些仿真系统用队列来模拟银行或杂货店里排队的顾客。
队列的两种主要操作是:向队列中插入新元素和删除队列中的元素。插入操作也叫做入队,删除操作也叫做出队。入队操作在队尾插入新元素,出队操作删除队头的元素。
队列的另外一项重要操作是读取队头的元素。这个操作叫做peek()。该操作返回队头元素,但不把它从队列中删除。除了读取队头元素,我们还想知道队列中存储了多少元素,可以使用length 属性满足该需求;要想清空队列中的所有元素,可以使用clear() 方法来实现。
2 一个用数组实现的队列
使用数组来实现队列看起来顺理成章。JavaScript 中的数组具有其他编程语言中没有的优点,数组的push() 方法可以在数组末尾加入元素,shift() 方法则可删除数组的第一个元素。
//队尾添加一个元素
function enqueue(element) {
this.dataStore.push(element);
}
//删除队首的元素
function dequeue() {
return this.dataStore.shift();
}
//读取队首的元素
function front() {
return this.dataStore[0];
}
//读取队尾的元素
function back() {
return this.dataStore[this.dataStore.length-1];
}
//toString() 方法显示队列内的所有元素
function toString() {
var retStr = "";
for (var i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
//判断队列是否为空
function empty() {
if (this.dataStore.length == 0) {
return true;
}
else {
return false;
}
}
function Queue() {
this.dataStore = [];
this.enqueue = enqueue; //队尾添加一个元素
this.dequeue = dequeue; //删除队首的元素
this.front = front; //读取队首的元素
this.back = back; //读取队尾的元素
this.toString = toString; //toString() 方法显示队列内的所有元素
this.empty = empty; //判断队列是否为空
}
// 测试程序
var q = new Queue();
q.enqueue("Meredith");
q.enqueue("Cynthia");
q.enqueue("Jennifer");
/*Meredith
Cynthia
Jennifer*/
console.log(q.toString());
q.dequeue();
/*Cynthia
Jennifer*/
console.log(q.toString());
//Front of queue: Cynthia
console.log("Front of queue: " + q.front());
//Back of queue: Jennifer
console.log("Back of queue: " + q.back());
参考:数据结构与算法JavaScript描述