队列的定义、基本操作、案例

📝个人主页:爱吃炫迈
💌系列专栏:数据结构与算法
🧑‍💻座右铭:道阻且长,行则将至💗



队列

队列是一种特殊的线性表,只能在头尾两端进行操作。

  • 队尾(rear):只能从队尾添加元素,一般叫作入队
  • 队头(front):只能从队头移除元素,一般叫作出队
  • 空队列:不包含任何元素的空表。

队列的静态图演示

请添加图片描述

队列的动图演示

请添加图片描述

生活中的队列

排队买票,先排队的人先买上票离开,后排队的人后买票离开。

请添加图片描述

队列是一个线性的数据结构,并且这个数据结构只允许在一端进行插入,另一端进行删除,禁止直接访问除这两端以外的一切数据,且队列是一个先进先出(简称FIFO结构)的线性表。


队列的基本操作

定义队列

function Queue(){
    this.dataStore = [];
    this.enqueue = enqueue;     //入队
    this.dequeue = dequeue;     //出队
    this.front = front;         //查看队首元素
    this.back = back;           //查看队尾元素
    this.toString = toString;   //显示队列所有元素
    this.clear = clear;         //清空当前队列
    this.empty = empty;         //判断当前队列是否为空
}

enqueue:向队列添加元素

//向队列末尾添加一个元素,直接调用 push 方法即可

function enqueue ( element ) {
    this.dataStore.push( element );
}

dequeue:删除队首的元素

因为JS中的数组具有其他语言没有的有点,可以直接利用 shift 方法删除数组的第一个元素,因此,出队操作的实现就变得很简单了。

//删除队列首的元素,可以利用 JS 数组中的 shift 方法

function dequeue () {
    if( this.empty() ) return 'This queue is empty';
    else this.dataStore.shift();
}

注意:上面我做了一个判断,队列是否还有元素,因为去删除空队列的元素是没有意义的,那么,我们就来看看 empty 方法是如何实现的。


empty:判断队列是否为空

//我们通过判断 dataStore 的长度就可知道队列是否为空

function empty(){
    if( this.dataStore.length == 0 ) return true;
    else return false;
}

front:查看队首元素

//查看队首元素,直接返回数组首个元素即可

function front(){
    if( this.empty() ) return 'This queue is empty';
    else return this.dataStore[0]}

back:查看队尾元素

//查看队首元素,直接返回数组最后一个元素即可

//读取队列尾的元素
function back () {
    if( this.empty() ) return 'This queue is empty';
    else return this.dataStore[ this.dataStore.length - 1 ];
}

toString:查看队列中所有元素

//查看对了所有元素,我这里采用数组的 join 方法实现

function toString(){
    return this.dataStore.join('\n');
}

clear:清空队列

//清空当前队列,也很简单,我们直接将 dataStore 数值清空即可

function clear(){
    delete this.dataStore;
    this.dataStor = [];
}

测试

var queue = new Queue();
console.log(queue.empty()); //true

//添加几个元素
queue.enqueue("Apple");
queue.enqueue("Banana");
queue.enqueue("Pear");

console.log(queue.empty()); // false

//查看队首元素
console.log(queue.front()); // Apple
//查看队尾元素
console.log(queue.back()); // Pear

//出队
queue.dequeue();

//查看队首元素
console.log(queue.front()); // Banana
//查看队尾元素
console.log(queue.back()); // Pear

console.log(queue.toString()); //  Banana,Pear

//清空队列
queue.clear();

console.log(queue.empty()); // true


案例

题目描述最近的请求次数

请添加图片描述

解题思路

我们可以用一个队列维护发生请求的时间,当在时间 t 收到请求时,将时间 t 入队。

由于每次收到的请求的时间都比之前的大,因此从队首到队尾的时间值是单调递增的。当在时间 t 收到请求时,为了求出[t-3000,t] 内发生的请求数,我们可以不断从队首弹出早于 t−3000 的时间。循环结束后队列的长度就是[t-3000,t]内发生的请求数。

var RecentCounter = function() {
    this.queue = [];
};

RecentCounter.prototype.ping = function(t) {
    this.queue.push(t);
    while (this.queue[0] < t - 3000) {
        this.queue.shift();
    }
    return this.queue.length;
};

💞总结💞

希望我的文章能对你学习队列有所帮助!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃炫迈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值