数据结构之队列总结

本文介绍了如何利用队列和栈实现特定功能。包括使用队列计算[t-3000,t]区间内的ping次数,以及利用两个栈模拟实现栈的先进后出(FIFO)特性,和用两个栈实现队列的先进先出。这些实现方法展示了数据结构在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

介绍

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列相关算法题

力扣933—最近请求次数
题目大意:计算范围为[t -3000,t]的ping个数。
思路:

  1. 定义一个空队列
  2. 每次调用ping方法时,现将当前t入队,然后将不满足[t -3000,t]出队,最后返回当前队列个数即为满足[t -3000,t]的个数。

代码:

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

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

力扣225—用队列实现栈
题目大意:使用两个队列,实现栈的先进后出。
思路:

  1. 题目已经要求使用两个队列,所以先初始化两个空队列。
  2. push():直接在queue1入队
  3. pop():先判断queue1队列是否为空,若为空,和queue2队列进行交换(因为这两个队列的顺序都是一致的)。然后将queue1的元素推入到queue2里面,直到就剩下一个元素,直接弹出并返回。
  4. top():调用刚刚写的pop()方法,可以得到queue1最后一个元素,因为是取栈顶而不是将它弹出队列,所以要将它推回queue1里面,最后直接返回该元素即可
  5. empty():判断这两个队列是否都为空,若有一个不为空,说明这两个队列形成的栈有元素(因为pop()方法)。
var MyStack = function() {
    this.queue1 = []
    this.queue2 = []
};

/** 
 * @param {number} x
 * @return {void}
 */
MyStack.prototype.push = function(x) {
    this.queue1.push(x)
};

/**
 * @return {number}
 */
MyStack.prototype.pop = function() {
    if(this.queue1.length === 0){
        [this.queue1,this.queue2] = [this.queue2,this.queue1];
    }
    let len = this.queue1.length
    while(len > 1){
        this.queue2.push(this.queue1.shift())
        len--
    }
    return this.queue1.shift()
};

/**
 * @return {number}
 */
MyStack.prototype.top = function() {
    let x = this.pop()
    this.queue1.push(x)
    return x
};

/**
 * @return {boolean}
 */
MyStack.prototype.empty = function() {
    return this.queue1.length === 0 && this.queue2.length === 0
};

力扣232—用栈实现队列

题目大意:使用两个栈实现队列的先进先出。
思路:

  1. 初始化两个栈(一个输入栈,一个输出栈)
  2. push():将元素推入stack1输入栈中
  3. pop():先判断stack2输出栈是否有元素,有的话直接pop()方法即可。没有的话,先将stack1输入栈里的元素逐一推入stack2输出栈里,最后直接pop()并将其返回出去即可。
  4. peek():调用刚刚自己写的pop()方法,拿到首元素,但是只是获取并不是将它真正的pop,所以还得将其推回stack2中,最后直接返回刚刚拿到的首元素即可。
  5. 同样检查两个栈是否同时为空,若有一个为空,表示该形成的队列还有元素。
var MyQueue = function() {
    this.stack1 = []
    this.stack2 = []
};

/** 
 * @param {number} x
 * @return {void}
 */
MyQueue.prototype.push = function(x) {
    this.stack1.push(x)
};

/**
 * @return {number}
 */
MyQueue.prototype.pop = function() {
    let len = this.stack2.length
    if(len){
        return this.stack2.pop()
    }
    let len1 = this.stack1.length
    while(len1--){
        this.stack2.push(this.stack1.pop())
    }
    return this.stack2.pop()
};

/**
 * @return {number}
 */
MyQueue.prototype.peek = function() {
    let x = this.pop()
    this.stack2.push(x)
    return x
};

/**
 * @return {boolean}
 */
MyQueue.prototype.empty = function() {
    return !this.stack1.length && !this.stack2.length
};

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值