每日一题——用两个栈实现队列

ops/2025/2/3 23:11:00/

用两个栈实现队列

    • 题目描述
      • 数据范围
      • 示例
    • 代码实现
      • 1. 代码思路
        • `push` 操作:
        • `pop` 操作:
      • 2. 代码实现
      • 3. 代码解析
      • 4. 时间复杂度与空间复杂度
    • 总结

题目描述

用两个栈来实现一个队列,使用 n 个元素来完成 n 次在队列尾部插入整数(push)和 n 次在队列头部删除整数(pop)的功能。队列中的元素为 int 类型。保证操作合法,即保证 pop 操作时队列内已有元素。

数据范围

  • 操作次数 n n n 满足 0 ≤ n ≤ 1000 0 \leq n \leq 1000 0n1000
  • 队列中的元素范围为 ∣ v a l ∣ ≤ 10000 |val| \leq 10000 val10000
  • 要求:存储 n 个元素的空间复杂度为 O ( n ) O(n) O(n),插入与删除的时间复杂度为 O ( 1 ) O(1) O(1)

示例

输入1:

["PSH1", "PSH2", "POP", "POP"]

输出1:

1, 2

解析:

  • "PSH1":将 1 插入队列尾部
  • "PSH2":将 2 插入队列尾部
  • "POP":删除一个元素,先进先出 => 返回 1
  • "POP":删除一个元素,先进先出 => 返回 2

输入2:

["PSH2", "POP", "PSH1", "POP"]

输出2:

2, 1

代码实现

1. 代码思路

  • 使用两个栈 stack1stack2 来模拟队列。
  • stack1 用于存储入队操作的元素。
  • stack2 用于存储出队操作时,从 stack1 中转移过来的元素。
push 操作:
  • 直接将元素压入 stack1
pop 操作:
  • 如果 stack2 为空,则将 stack1 中的所有元素转移到 stack2 中,这样 stack2 的栈顶就是最早进入队列的元素。
  • 如果 stack2 不为空,直接从 stack2 弹出栈顶元素。

2. 代码实现

#define MAX_SIZE 1000  // 假设栈最大容量
int stack1[MAX_SIZE];
int stack2[MAX_SIZE];int top1 = 0; // 插入栈栈顶指针
int top2 = 0; // 删除栈栈顶指针// 入队操作
void push(int node) {if (top1 < MAX_SIZE) {stack1[top1++] = node;  // 将元素压入 stack1}
}// 出队操作
int pop() {// 如果 stack2 为空,将 stack1 中的元素倒入 stack2if (top2 == 0) {while (top1 > 0) {stack2[top2++] = stack1[--top1];  // 将 stack1 中的元素倒入 stack2}}// 如果 stack2 不为空,正常弹出栈顶元素if (top2 > 0) {return stack2[--top2];  // 弹出 stack2 的栈顶元素}return -1;  // 当栈为空时返回 -1
}

3. 代码解析

  1. push 函数

    • 该函数将一个整数 node 压入 stack1,作为队列的尾部元素。
  2. pop 函数

    • 如果 stack2 为空,说明当前队列中没有待出队的元素,我们需要将 stack1 中的元素逐一移入 stack2,以确保 stack2 的栈顶为最早入队的元素。
    • 如果 stack2 不为空,则直接从 stack2 中弹出栈顶元素,这样确保了队列的先进先出特性。

4. 时间复杂度与空间复杂度

  • 时间复杂度

    • push 操作时间复杂度为 O ( 1 ) O(1) O(1),因为我们只是将元素压入 stack1
    • pop 操作的最坏时间复杂度为 O ( n ) O(n) O(n),当 stack2 为空时,需要将 stack1 中的所有元素转移到 stack2,不过每个元素最多被移动一次,因此在所有操作完成后的平均时间复杂度是 O ( 1 ) O(1) O(1)
  • 空间复杂度

    • 由于我们使用了两个栈,因此空间复杂度是 O ( n ) O(n) O(n),其中 n 是队列中元素的个数。

总结

整体上这题还是比较简单的,没什么难度,只要懂了思路还是很好实现的,最开始花了很多时间去实现栈,结果发现,卧槽怎么没有栈,没有主函数,原来只需要模拟栈即可。反正只要记住一个用来进入,一个用来出去,只要第二个栈空了,就把第一个倒进去。


http://www.ppmy.cn/ops/155416.html

相关文章

JWT 实战:在 Spring Boot 中的使用

文章目录 一、JWT简介二、JWT 的结构三、JWT 的生成过程四、JWT 验证过程五、JWT 的应用场景六、JWT的实现6.1 登录接口6.2 校验 Token 接口6.3 jwtUtil 类 七、总结 一、JWT简介 JWT&#xff08;JSON Web Token&#xff09;是一种用于客户端和服务器之间安全传输信息的开放标…

回顾Maven

Maven Maven简介 Maven 是 Apache 软件基金会的一个开源项目,是一个优秀的项目构建工具,它 用来帮助开发者管理项目中的 jar,以及 jar 之间的依赖关系、完成项目的编译、 测试、打包和发布等工作。 管理jar包管理jar包之间的依赖关系&#xff08;其中一个jar包可能同时依赖多个…

1979-2021年 全国各省、地级市、区县空气流通系数

1979-2021年 全国各省、地级市、区县空气流通系数.ziphttps://download.csdn.net/download/2401_84585615/89649517 https://download.csdn.net/download/2401_84585615/89649517 1979-2021年&#xff0c;全国各省、地级市、区县空气流通系数的研究数据&#xff0c;对于分析我国…

webview_flutter 4.10.0 技术文档

https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter 文档一 webview_flutter_4.10.0_docs.txt webview_flutter_4.10.0_docs.txt webview_flutter_4.10.0_docs.txt webview_flutter 4.10.0 技术文档 日期&#xff1a;2025年1月26日 …

无用知识之:std::initializer_list的秘密

先说结论&#xff0c;用std::initializer_list初始化vector&#xff0c;内部逻辑是先生成了一个临时数组&#xff0c;进行了拷贝构造&#xff0c;然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化&#xff0c;这个动作又触发了拷贝…

介绍使用 WGAN(Wasserstein GAN)网络对天然和爆破的地震波形图进行分类的实现步骤

以下将为你详细介绍使用 WGAN&#xff08;Wasserstein GAN&#xff09;网络对天然和爆破的地震波形图进行分类的实现步骤&#xff0c;包含代码实现和项目结题报告的大纲。 代码实现 1. 环境准备 确保你已经安装了必要的库&#xff0c;如 torch、torchvision、numpy、matplot…

89,[5]攻防世界 web Web_php_include

进入靶场 <?php // 显示当前 PHP 文件的源代码&#xff0c;方便调试或展示代码内容 show_source(__FILE__);// 从 URL 的查询字符串中获取名为 hello 的参数值&#xff0c;并将其输出到页面上 // 例如&#xff0c;当访问的 URL 为 "example.php?helloworld" 时&…

第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测

目录 1. Shufflenet V2 2. 甲状腺结节检测 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. Shufflenet V2 shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量&#xff0c;还应该多方面的考虑&#xff0c;例如MAC(memory acc…