队列

一、队列有什么特点,生活中有什么例子?

  1. 队列的特点。

    队列遵循(FIFO),先进先出原则的一组有序的项,队列在尾部添加新元素,并从顶部移除。

  2. 生活中的例子。

    安检机器,先进先出。

二、请实现一个队列,并实现以下方法:

  • enqueue(element):向队列尾部添加一个新的项。
  • dequeue():移除队列的第一项,并返回被移除的元素。
  • front():返回队列中第一个元素 —— 最先被添加,也将是最先被移除的元素。队列不做任何变动 (不移除元素,只返回元素信息 —— 与 Stack 类的 peek 方法类似)。
  • tail():返回队列中的最后一个元素,队列不做任何变动。
  • isEmpty():如果栈没有任何元素就返回 true,否则返回 false。
  • size():返回队列包含的的元素个数,与数组的 length 属性类似。
  • print():打印队列中的元素。

提示:Web 端优先使用 ES6 以上的语法实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
let Queue = (function () {
const item = new WeakMap();
class Queue {
constructor() {
item.set(this, []);
}
enqueue(element) {
item.get(this).push(element);
}
dequeue() {
return item.get(this).shift();
}
front() {
return item.get(this)[0];
}
tail() {
const queue = item.get(this);
return queue[queue.length - 1];
}
isEmpty() {
return !item.get(this).length;
}
size() {
return item.get(this).length;
}
print() {
return item.get(this).toString();
}
}
return Queue;
})()

三、使用队列计算斐波那契数列的第 n 项。

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:

1
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610...

在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),即前两项固定为 1,后面的项为前两项之和,依次向后**。**在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用。

使用示例如下:

1
2
3
fibonacci(5); --> 5
fibonacci(9); --> 34
fibonacci(14); --> 377
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function fibonacci(n) {
if (!/^[1-9]+[0-9]*$/.test(n)) throw new TypeError();
let queue = new Queue();
queue.enqueue(1);
queue.enqueue(1);
let index = 0;
while (n - 2 > index) {
index++;
const front = queue.dequeue();
const second = queue.front();
const next = front + second;
queue.enqueue(next);
}
console.log(queue.tail());
}

四、实现优先队列 PriorityQueue。

现实中优先队列的例子很多,比如机场登机的顺序,头等舱和商务舱乘客优先级高于经济舱乘客。又如在银行中办理业务时,VIP 客户的优先级高于普通客户。要实现一个优先队列,有两种方式:

  1. 设置优先级,然后在正确的位置添加元素。
  2. 用入列操作添加元素,然后按照优先级移除它们。

本题要求使用第一种方式来实现优先队列,数值越小优先级越高,若优先级相同时,先入队的元素,排在前面。

使用示例如下:

1
2
3
4
5
6
7
8
let priorityQueue = new PriorityQueue();
priorityQueue.enqueue("Meiyzeng", 2);
priorityQueue.enqueue("Semlinker", 1);
priorityQueue.enqueue("Jgg", 1);
priorityQueue.print();
// Semlinker - 1
// Jgg - 1
// Meiyzeng - 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function PriorityQueueElement(element, priority) {
this.element = element;
this.priority = priority;
}

class PriorityQueue {
constructor() {
this.item = [];
}
enqueue(element, priority) {
let priorityQueueElement = new PriorityQueueElement(element, priority);
const len = this.item.length;
let elementOnTheQueue = false;
for (let i = 0; i < len; i++) {
if (priorityQueueElement.priority < this.item[i].priority) {
this.item.splice(i, 0, priorityQueueElement);
elementOnTheQueue = true;
break;
}
}
if (!elementOnTheQueue) {
this.item.push(priorityQueueElement);
}
}
print() {
for (let i = 0; i < this.item.length; i++) {
console.log(`${this.item[i].element}-${this.item[i].priority}`);
}
}
}

五、用队列实现栈。

利用两个队列实现栈,栈的特点是后进先出,可以让元素入队 q1,留下队尾元素让其他元素出队,暂存到 q2 中,再让 q1 中剩下的元素出队,即最后进的最先出来。

1
2