学习数据结构和算法的第二天,学习了数据结构中的队列。
相较于栈来说,队列同样也是一种受控的线性数据结构,但是与栈结构不同的是,队列是先进先出(frist in first out),只能由队尾进入,队首顶出,实际生活中类似于排队购票。
在数据结构中队列分为一般队列和优先级队列,即无排序队列和有排序队列,类似于机场购票中的普通通道和vip通道。
封装一般队列:
class Queue {
// 属性
items = [];
// 方法
// 元素插入队列
enqueue(element) {
this.items.push(element);
}
// 移除队列元素
dequeue() {
return this.items.shift();
}
// 返回队首元素
front() {
return this.items[0];
}
// 队列是否为空
isEmpty() {
return this.items.length == 0;
}
// 队列元素数量
size() {
return this.items.length;
}
// 转string
toString() {
return this.items.map((item) => String(item)).join();
}
}
这里同样是使用了数组来模拟一般队列的实现
实际应用:击鼓传花
const nameList = ["小明", "小红", "小曾", "小李"];
const num = 3;
const passGames = (nameList, num) => {
const queue = new Queue(); // 此处的Queue类是上文的模拟队列
nameList.forEach((element, index, array) => {
queue.enqueue(element);
});
while (queue.size() > 1) {
for (let i = 0; i < num - 1; i++) {
queue.enqueue(queue.dequeue());
}
queue.dequeue();
}
return nameList.indexOf(queue.front());
};
passGames(nameList, num);
面试时比较常考的题目 可以用队列来实现
优先级队列的实现:
// 优先级队列
class PriorityQueue {
items = [];
constructor(element, priority) {
this.element = element;
this.priority = priority;
}
// 优先级队列插入
enqueue(element, priority) {
const queueElement = new PriorityQueue(element, priority);
if (this.items.isEmpty()) {
this.items.push(element);
} else {
let isInsert = false; // 判断是否已插入
for (let i = 0; i < this.items.length; i++) {
if (queueElement.priority < this.items[i].priority) {
this.items.splice(i, 0, queueElement);
isInsert = true;
}
if (!isInsert) {
this.items.push(element);
}
}
}
}
}
优先级队列的插入需要判断数据的优先级并对数据进行排序,其余的操作都和一般队列一样。