JavaScript数据结构 --- 队列
队列是一种列表,不同的是队列只能在队尾插入元素,在队首删除元素。是一种先进先出(First-In-First-Out,FIFO)的数据结构。
队列的两种主要操作是:向队列中插入新的元素和删除队列中的元素。插入操作叫入队,删除操作叫出队。队列的另一项重要操作是读取队头元素而不把它从队列中删除,命名为 peek()。
用数组实现队列
使用数组实现队列很方便,数组的 push() 方法可以在数组末尾加入元素,shift() 方法可以删除数组的第一个元素。
构造 Queue 类。
function Queue() {
this.dataStore = [];
this.enqueue = enqueue; // 向队尾添加一个元素
this.dequeue = dequeue; // 删除队首的元素
this.front = front; // 读取队首元素
this.back = back; // 读取队尾元素
this.toString = toString; // 显示队内所有元素
this.empty = empty; //判断队列是否为空
}
enqueue() 方法向队尾添加一个元素。
function enqueue(element) {
this.dataStore.push(element);
}
dequeue() 方法删除队首元素。
function dequeue() {
return this.dataStore.shift();
}
front() 读取队首元素,back() 读取队尾元素。
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] + "
";
}
return retStr;
}
empty() 判断队列是否为空。
function empty() {
if (this.dataStore.length == 0) {
return true;
}
else {
return false;
}
}
**使用队列:方块舞的舞伴分配问题** 队列经常用于模拟排队的人,可以用队列来模拟跳方块舞的人。 当男生女生来到舞池,他们按自己的性别排成两排,当舞池中有地方空出来时,选两个队列中的第一个人组成舞伴。他们身后的人各自向前移动一位,变成新的队首。当一对舞伴进入舞池时,主持人通报他们的名字。当一对舞伴走出舞池,且两排队列中有任意一对没人时,主持人也会把情况通报给大家。 先将男生女生的名字存在文件中。
- M Bruno Mars
- M Justin Bieber
- M Wiz Khalifa
- M Charlie Puth
- M Ed Sheeran
- M Sam Smith
- M Hans Zimmer
- M Jason Mraz
- F Ellie Gouding
- F Kayt Perry
- F Taylor Swift
- F Aviril Lavigne
每个舞者的信息都被存储在一个 Dancer 对象中。
function Dancer(name, sex) {
this.name = name;
this.sex = sex;
}
写一个函数读取舞者信息。
function getDancers(males, females) {
var names = red("dancers.txt").split("
");
for (var i = 0; i < names.length; i++) {
names[i] = names[i].trim(); //去掉每行字符串后面的空格
}
for (var i = 0; i < names.length; i++) {
var dancer = names[i].split("");
var sex = dancer[0];
var name = dancer[1];
if (sex == "F") {
females.enqueue(new Dancer(name, sex));
}
else {
males.enqueue(new Dancer(name, sex));
}
}
}
将男生和女生组成舞伴,并宣布配对结果。
function dance(males, females) {
console.log("The dance partners are:
");
while (!females.empty() && !males.empty()) {
person = females.dequeue();
console.log("Females dancer is:" + person.name);
person = males.dequeue();
console.log("Males dancer is:" + person.name);
}
console.log();
}
参考资料:
JavaScript高级程序设计
JavaScript MDN
Data Structures and Algorithms with JavaScript