1 对队列的操作
队列的两种主要操作是: 向队列中插入新元素和删除队列中的元素。 插入操作也叫做入队, 删除操作也叫做出队。 入队操作在队尾插入新元素, 出队操作删除队头的元素。
另外:
(1)读取队头的元素。 这个操作叫做 peek()
。 该操作返回队头元素, 但不把它从队列中删除。
(2)队列中存储了多少元素,可以使用 length
属性满足该需求;
(3) 要想清空队列中的所有元素, 可以使用 clear()
方法来实现。
2 一个用数组实现的队列
原理:数组的 push() 方法可以在数组末尾加入元素, shift() 方法则可删除数组的第一个元素。
//构造函数
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();
}
//读取队首和队尾的元素
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;
}
}
3 使用队列: 方块舞的舞伴分配问题
问题:按照自己的性别排成两队。 当舞池中有地方空出来时, 选两个队列中的第一个人组成舞伴。 他们身后的人各自向前移动一位, 变成新的队首。 当一对舞伴迈入舞池时, 主持人会大声喊出他们的名字。 当一对舞伴走出舞池, 且两排队伍中有任意
一队没人时, 主持人也会把这个情况告诉大家。
//将舞者存在dancer对象中
function Dancer(name, sex) {
this.name = name;
this.sex = sex;
}
// trim() 函数除去了每行字符串后的空格。
//将每行字符串按性别和姓名分成两部分存入一个数组。根据性别将舞者加入不同的队列。
function getDancers(males, females) {
var names = read("dancers.txt").split("\n");
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) {
print("The dance partners are: \n");
while (!females.empty() && !males.empty()) {
person = females.dequeue();
putstr("Female dancer is: " + person.name);
person = males.dequeue();
print(" and the male dancer is: " + person.name);
}
print();
}
4 使用队列对数据进行排序
/*基数排序
* nums :需要排序的数组
* queues :数组,里面元素是队列
* n :队列的格式,这里为10个
* digit :传入1,则先按个位上的数字排序;传入10,则按十位上的数字排序
* */
function distribute(nums,queues,n,digit){
for(var i = 0;i < n;i++){
if(digit == 1){
queues[nums[i]%10].enqueue(nums[i]);
}else if(digit == 10){
queues[Math.floor(nums[i]/10)].enqueue(nums[i]);
}else{
}
}
}
function collect(queues,nums){
var i = 0;
for(var j = 0;j < 10;j++){
while(!queues[j].empty()){
nums[i++] = queues[j].dequeue();
}
}
}
/*测试程序*/
var queues = [];
for(var i = 0;i < 10;i++){
queues[i] = new Queue();
}
var nums = [];
for(var i = 0;i < 10;i++){
nums[i] = Math.floor(Math.random()*101);
}
console.log("开始的nums: "+nums);//24,72,90,84,49,69,8,30,50,0
distribute(nums,queues,10,1);
collect(queues,nums);
distribute(nums,queues,10,10);
collect(queues,nums);
console.log("排序后的nums: "+nums);//0,8,24,30,49,50,69,72,84,90
5 优先队列
优先队列:在一般情况下, 从队列中删除的元素, 一定是率先入队的元素。 但是也有一些使用队列的应用, 在删除元素时不必遵守先进先出的约定。
举例:
优先码的值最小的元素优先级最高。 新的 dequeue() 方法遍历队列的底层存储数组, 从中找出优先码最低的元素, 然后使用数组的 splice() 方法删除优先级最高的元素。
function dequeue() {
var priority = this.dataStore[0].code;
for (var i = 1; i < this.dataStore.length; ++i) {
if (this.dataStore[i].code < priority) {
priority = i;
}
}
return this.dataStore.splice(priority,1);
}