【数据结构与算法】用两个栈实现一个队列

devtools/2024/9/23 4:44:45/

题目

  • 用两个栈,实现一个队列
  • 功能 add delete length

队列

        用数组可以实现队列,数组和队列的区别是:队列是逻辑结构是一个抽象模型,简单地可以用数组、链表实现,所以数组和链表是一个物理结构,队列是一个逻辑结构。数组和链表可以实现队列,但是复杂的队列服务则需要单独设计。如常见的消息队列。

队列的特性:先进先出

API: add delete length

// 数组的队列形式
const queue = []queue.push(100) // 入队
queue.push(200)const n =  queue.shift() // 出队

实现思路

 如现有一个队列,入队顺序是 A B C,出队顺序也是 A B C,用两个栈 stack1、stack2 实现入队、出队。由于栈是先进后出,所以需要在A B C分别入栈 stack1 后,再将 stack1 每个元素pop 出栈且入栈 stack2 ,接着将 stack2 进行pop 操作,此时 A 出栈。最后将 stack2 内剩余元素压回到 stack1,方便后续stack1 的入栈操作。所以当队列里要入队一个元素时只需要一步,而要出队一个元素时则需要在两个 stack 之间进行腾挪。

 

/**
* 两个栈一个队列
*/
export class MyQueue {private stack1: number[] = []private stack2: number[] = []// 入队add(n: number) {this.stack1.push(n)}// 出队delete(n: number) {let resconst stack1 = this.stack1const stack2 = this.stack2// 将 stack1 所有元素移动到 stack2 中while(stack1.length) {const n = stack1.pop()if(n != null) {stack2.push(n)}}// stack2 popres = stack2.pop()// 将 stack2 中的元素还给 stack1while(stack2.length) {const n = stack2.pop()if(n != null) {stack1.push(n)}}return res || null}// 入队get length(): number {return this.stack1.length}
}

单元测试 

/**
* 两个栈,一个队列
*/
describe('两个栈,一个队列', () => {it('add and length', () => {const q = new MyQueue()expect(q.length).toBe(0)q.add(100)q.add(200)q.add(300)expect(q.length).toBe(3)})it('delete', () => {const q = new MyQueue()expect(q.delete()).toBeNull()q.add(100)q.add(200)q.add(300)expect(q.delete()).toBe(100)expect(q.length).toBe(2)expect(q.delete()).toBe(200)expect(q.length).toBe(1)})
})


http://www.ppmy.cn/devtools/4787.html

相关文章

redis之分布式锁

当使用Java实现分布式锁时,可以使用Redis的分布式锁机制。在Java中,你可以使用Jedis作为Redis的Java客户端来实现这一目的。下面是一个简单的示例代码,演示了如何在Java中使用Redis实现分布式锁。 首先,确保你的Java项目中引入了…

Leetcode 410 分割数组

题目信息 LeetoCode地址: . - 力扣(LeetCode) 题目理解 将一个数组切k刀,每一块子数组求和,共k1个数,这里面有一个最大的数Max。找一种切法,使这个Max最小。 暴力解法一定是会超时的,因为包…

SpringBoot:正常启动,Controller 无法访问

一、server.servlet.context-path配置的作用 定义: server.servlet.context-path # Context path of the application. 应用的上下文路径,也可以称为项目路径,是构成url地址的一部分。 server.servlet.context-path不配置时,默认…

【软件设计师】计算机软考下午题试题六,Java设计模式之简单工厂模式。

【软件设计师】计算机软考下午题试题六,Java设计模式之简单工厂模式。 代码如下: //简单工厂模式 public class SimpleFactory {public static void main(String[] args) {Product ProductAFactory.createProduct("A");ProductA.info();Produc…

Linux权限

目录 1.Linux权限 1.什么是权限?? 2.权限的本质? 3.Linux下有两种用户: 4.Linux中文件的权限 2.修改权限的方法 1.快速掌握修改权限的做法 2.对比权限有无,表现 3.修改权限的第二套方法 4.文件类型 3.权限问…

Linux第91步_了解“platform总线,platform驱动和platform设备”,以及驱动框架和设备框架

plattorm是为了驱动的分离与分层而提出来的一种框架,其驱动的具体实现还是需要字符设备驱动、块设备驱动或网络设备驱动。 对于一个完整的驱动程序,必须提供“有设备树”和“无设备树”两种匹配方法。 1、总线 Linux系统内核使用bus_type结构体表示总线…

web、android和ios共同能够实现滑动及同步测试(实测)

web、android和ios共同能够实现滑动及同步测试(实测) 1、三者滑动效果 描述:在web页面拼好了之后,使用android和ios进行测试的时候,android轮播图能够实现触摸滑动,但是ios不可以,于是添加一下…

(五)C++自制植物大战僵尸游戏LoadingScene的实现讲解

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/xjvbb 一、类介绍 游戏启动后就会立即切换到游戏加载场景中。只有游戏资源文件加载完成后,才能进入游戏。Loadingscene类继承Cocos2d-x中的Scene父类,表明Loadingscene是一个场景类。切换到Loadi…