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

server/2025/2/3 20:26:01/

用两个栈实现队列

    • 题目描述
      • 数据范围
      • 示例
    • 代码实现
      • 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/server/164704.html

相关文章

【系统架构设计师】真题论文: 论微服务架构及其应用(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 真题题目(2021年 试题4) 微服务提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通。在微服务架构中,每…

HTTP 网络通信协议

用于在网络中进行数据交换的协议。 一、定义与作用 HTTP 是互联网上信息传递与共享的重要基础&#xff0c;它规定了客户端&#xff08;如浏览器&#xff09;与服务器之间进行数据交互的格式和规则&#xff0c;使得客户端能够向服务器请求各种资源&#xff08;如网页、图片、视…

GenAI 在金融服务领域的应用:2025 年的重点是什么

作者&#xff1a;来自 Elastic Karen Mcdermott GenAI 不是魔法 我最近参加了 ElasticON&#xff0c;我们与纽约 Elastic 社区一起度过了一天&#xff0c;讨论了使用检索增强生成 (retrieval augmented generation - RAG) 为大型语言模型 (large language models - LLMs) 提供…

基于python的Kimi AI 聊天应用

因为这几天deepseek有点状况&#xff0c;导致apikey一直生成不了&#xff0c;用kimi练练手。这是一个基于 Moonshot AI 的 Kimi 接口开发的聊天应用程序&#xff0c;使用 Python Tkinter 构建图形界面。 项目结构 项目由三个主要Python文件组成&#xff1a; 1. main_kimi.py…

基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

深度学习的应用场景及常用技术

深度学习作为机器学习的一个重要分支&#xff0c;在众多领域都有广泛的应用&#xff0c;以下是一些主要的应用场景及常用技术。 1.应用场景 1. 计算机视觉 图像分类 描述&#xff1a;对图像中的内容进行分类&#xff0c;识别出图像中物体所属的类别。例如&#xff0c;在安防领…

虚幻基础10:isValid

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录 isValid isValid 节点&#xff1a;检测资产&#xff0c;防止游戏崩溃。

MySQL知识点总结(十四)

mysqldump和mysqlpump实用程序在功能上有哪些相同和不同的地方&#xff1f; 二者都能用来执行逻辑备份&#xff0c;将所有数据库&#xff0c;特定数据库或特定表转储到文本文件&#xff0c;可移植&#xff0c;独立于存储引擎&#xff0c;是很好的复制/移动策略&#xff0c;适合…