数据结构队列概述
Posted 橘猫吃不胖~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构队列概述相关的知识,希望对你有一定的参考价值。
数据结构队列概述
1 认识队列
队列是受限的线性表,先进先出(FIFO,First In First Out),受限之处在于它只允许在表的前端进行删除操作,在表的后端进行插入操作。
在生活中队列结构也很常见,比如说排队的时候,某人先排队,那么他的问题就会被先解决,某人后来,他的问题就被后解决。
队列示意图:
队列有两种实现方案:①基于数组实现;②基于链表实现
2 队列的常见操作
- enqueue(element):向队列尾部添加一个(或多个)新的项。
- dequeue():移除队列的第一项(排在队列最前面的),并返回被移除的元素。
- front():返回队列中第一个元素——最先被添加,也是最先被移除的元素,队列不做任何变动。
- isEmpty():如果队列中不包含任何元素,返回true,否则返回false。
- size():返回队列包含的元素个数,与数组的length属性类似
- toString():将队列中的内容转成字符串形式
下面使用数组来实现队列的操作:
function Queue()
this.items = []; // 属性
// 将元素加到队列中
Queue.prototype.enqueue = function (element)
this.items.push(element);
// 从队列中删除前端元素
Queue.prototype.dequeue = function ()
return this.items.shift();
// 查看队列第一个元素
Queue.prototype.front = function ()
return this.items[0];
// 查看队列是否为空
Queue.prototype.isEmpty = function ()
return this.items.length == 0;
// 查看队列中元素的个数
Queue.prototype.size = function ()
return this.items.length;
// 将队列转化成字符串输出
Queue.prototype.toString = function ()
// 按照元素+空格+元素将其转化为字符串
let result = "";
for (let i = 0; i < this.items.length; i++)
result += this.items[i] + " ";
return result;
3 击鼓传花实例
游戏规则:几个人一起玩游戏,围成一圈,这时规定了一个数字,从某个人开始数数,当数到该数字的人自动淘汰;剩下的人继续数该数字,当再次数到该数字时,这个人淘汰,以此类推,最后剩下的那个人获胜。
根据上面队列编写的方法再编写程序,输出获胜的人的姓名。
【实现思路】将玩游戏的人装在一个队列中,从第一个人开始数,如果某个人数到了这个给定的数字,则他被从队列删除,如果没有数到该数字,则将其排到队列的最后。
代码如下:
// 传入两个参数,玩游戏的人名单和给定的数字
function passGame(nameList, num)
// 创建一个队列
let queue = new Queue();
// 将所有人加入到队列中
for (let i = 0; i < nameList.length; i++)
queue.enqueue(nameList[i]);
// 循环数数,直到剩下最后一个人
while (queue.size() > 1)
// 没有数到给定数字,将其排列到队列最后面
for (let i = 0; i < num - 1; i++)
queue.enqueue(queue.dequeue());
// 数到给定数字,这个人淘汰
queue.dequeue();
// 输出最后获胜的人
console.log(queue.front());
let nameList = ["Tony", "Lucy", "Alice", "Bob", "Happy"];
passGame(nameList, 5);
程序结果:Lucy
4 优先级队列
优先级队列在插入一个元素时,会考虑该数据的优先级。该元素会与队列中其他元素进行比较,比较完成后,可以得出这个元素在队列中的正确的位置。
优先级队列在生活中也很常见,比如我们有一堆事情要处理,在时间比较紧迫的情况下,我们会优先处理时间比较紧而且比较重要的事情,不太重要的事情会往后推一推。
下面通过一个程序来实现优先级队列。实现优先级队列有两点要求:①封装元素时和优先级放在一起;②添加元素时,将新插入的元素的优先级和队列中已经存在的元素优先级进行比较,以获得自己的正确位置。
示例代码如下:
function PriorityQueue()
// 两个参数,一个是元素,一个是优先级
function QueueElement(element, priority)
this.element = element
this.priority = priority;
// 封装属性
this.items = [];
// 实现插入方法
PriorityQueue.prototype.enqueue = function (element, priority)
// 创建对象
let queueElement = new QueueElement(element, priority);
// 判断队列是否为空
if (this.items.length == 0)
this.items.push(queueElement); // 将该元素直接添加到队列中
else // 如果队列不为空
let added = false; // 标记队列中元素位置是否更改
for (let i = 0; i < this.items.length; i++) // 当前元素与队列中元素进行比较
if (queueElement.priority < this.items[i].priority) // 查找到位置
this.items.splice(i, 0, queueElement); // 将元素添加到自己的位置
added = true; // 标记队列元素更改
break; // 结束当前循环
if (!added) // 如果没有在队列中找到自己的顺序,表示该优先级最小
this.items.push(queueElement); // 将其添加到队列末尾
let pq = new PriorityQueue();
// 为队列添加4个元素
pq.enqueue(2, 2);
pq.enqueue(16, 16);
pq.enqueue(9, 9)
pq.enqueue(1, 1);
// 输出排序后的队列
console.log(pq.items);
以上是关于数据结构队列概述的主要内容,如果未能解决你的问题,请参考以下文章