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

用两个栈实现队列

    • 题目描述
      • 数据范围
      • 示例
    • 代码实现
      • 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.mzph.cn/diannao/68850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自然语言处理(NLP)入门:基础概念与应用场景

什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f; 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;研究如何让计算机理解、生成、分析和与人类语言进行交互。换句话说&…

Chapter2 Amplifiers, Source followers Cascodes

Chapter2 Amplifiers, Source followers & Cascodes MOS单管根据输入输出, 可分为CS放大器, source follower和cascode 三种结构. Single-transistor amplifiers 这一章学习模拟电路基本单元-单管放大器 单管运放由Common-Source加上DC电流源组成. Avgm*Rds, gm和rds和…

Linux系统上安装与配置 MySQL( CentOS 7 )

目录 1. 下载并安装 MySQL 官方 Yum Repository 2. 启动 MySQL 并查看运行状态 3. 找到 root 用户的初始密码 4. 修改 root 用户密码 5. 设置允许远程登录 6. 在云服务器配置 MySQL 端口 7. 关闭防火墙 8. 解决密码错误的问题 前言 在 Linux 服务器上安装并配置 MySQL …

LeetCode 344: 反转字符串

LeetCode 344: 反转字符串 - C语言题解 这道题的目标是反转一个字符数组&#xff08;字符串&#xff09;。我们将通过双指针法来实现这一功能。 代码实现 #include <stdio.h>void reverseString(char* s, int sSize) {int left 0, right sSize - 1; // 定义左右指针…

网站快速收录:如何设置robots.txt文件?

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/34.html 为了网站快速收录而合理设置robots.txt文件&#xff0c;需要遵循一定的规则和最佳实践。robots.txt文件是一个纯文本文件&#xff0c;它告诉搜索引擎爬虫哪些页面可以访问&#xff…

PaddleOCR 截图自动文字识别

春节假期在家无聊&#xff0c;撸了三个小工具&#xff1a;PC截图编辑/PC录屏(用于meeting录屏)/PC截屏文字识别。因为感觉这三个小工具是工作中常常需要用到的&#xff0c;github上也有很多开源的&#xff0c;不过总有点或多或少的小问题&#xff0c;不利于自己的使用。脚本的编…

【Java异步编程】基于任务类型创建不同的线程池

文章目录 一. 按照任务类型对线程池进行分类1. IO密集型任务的线程数2. CPU密集型任务的线程数3. 混合型任务的线程数 二. 线程数越多越好吗三. Redis 单线程的高效性 使用线程池的好处主要有以下三点&#xff1a; 降低资源消耗&#xff1a;线程是稀缺资源&#xff0c;如果无限…

14-9-2C++STL的set容器

&#xff08;一&#xff09;函数对象的基本概念 set容器的元素排序 1.set<int,less<int> >setlntA;//该容器是按升序方式排列元素&#xff0c;set<int>相当于set<int,less<int>> 2.set<int,greater<int> >setlntB;//该容器是按降序…

音视频入门基础:RTP专题(8)——使用Wireshark分析RTP

一、引言 通过Wireshark可以抓取RTP数据包&#xff0c;该软件可以从Wireshark Go Deep 下载。 二、通过Wireshark抓取RTP数据包 首先通过FFmpeg将一个媒体文件转推RTP&#xff0c;生成RTP流&#xff1a; ffmpeg -re -stream_loop -1 -i input.mp4 -vcodec copy -an -f rtp …

tf.Keras (tf-1.15)使用记录3-model.compile方法

model.compile 是 TensorFlow Keras 中用于配置训练模型的方法。在开始训练之前&#xff0c;需要通过这个方法来指定模型的优化器、损失函数和评估指标等。 注意事项: 在开始训练&#xff08;调用 model.fit&#xff09;之前&#xff0c;必须先调用 model.compile()。 1 基本…

解决whisper 本地运行时GPU 利用率不高的问题

我在windows 环境下本地运行whisper 模型&#xff0c;使用的是nivdia RTX4070 显卡&#xff0c;结果发现GPU 的利用率只有2% 。使用 import torch print(torch.cuda.is_available()) 返回TRUE。表示我的cuda 是可用的。 最后在github 的下列网页上找到了问题 极低的 GPU 利…

大模型综合性能考题汇总

- K1.5长思考版本 一、创意写作能力 题目1&#xff1a;老爸笑话 要求&#xff1a;写五个原创的老爸笑话。 考察点&#xff1a;考察模型的幽默感和创意能力&#xff0c;以及对“原创”要求的理解和执行能力。 题目2&#xff1a;创意故事 要求&#xff1a;写一篇关于亚伯拉罕…

在 crag 中用 LangGraph 进行评分知识精炼-下

在上一次给大家展示了基本的 Rag 检索过程&#xff0c;着重描述了增强检索中的知识精炼和补充检索&#xff0c;这些都是 crag 的一部分&#xff0c;这篇内容结合 langgraph 给大家展示通过检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;的工作流&am…

(二)QT——按钮小程序

目录 前言 按钮小程序 1、步骤 2、代码示例 3、多个按钮 ①信号与槽的一对一 ②多对一&#xff08;多个信号连接到同一个槽&#xff09; ③一对多&#xff08;一个信号连接到多个槽&#xff09; 结论 前言 按钮小程序 Qt 按钮程序通常包含 三个核心文件&#xff1a; m…

win11本地部署 DeepSeek-R1 大模型!免费开源,媲美OpenAI-o1能力,断网也能用

一、下载ollama 二、安装ollama 三、部署DeepSeek-R1 在cmd窗口中先输入ollama -v查看ollama是否安装成功&#xff0c;然后直接运行部署deepseek-r1的命令 ollama run deepseek-r1&#xff0c;出现下面界面即为安装成功。 C:\Users\admin>ollama -v ollama version is 0.5…

蓝桥杯例题六

奋斗是一种态度&#xff0c;也是一种生活方式。无论我们面对什么样的困难和挑战&#xff0c;只要心怀梦想&#xff0c;坚持不懈地努力&#xff0c;就一定能够迈向成功的道路。每一次失败都是一次宝贵的经验&#xff0c;每一次挫折都是一次锻炼的机会。在困难面前&#xff0c;我…

【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中

文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型&#xff1a;中间结果的处理4.5 方案验证&#xff0c;首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…

B+ 树的实现原理与应用场景

B 树是如何实现的全面分析 在进行数据库和文件系统的设计中&#xff0c;B 树是一种常用的数据结构。它不仅是 B 树的延伸&#xff0c;而且团结了性能优化和实现上的优势。本文将从学术理论和实现程序的角度&#xff0c;分析 B 树是如何实现的&#xff0c;以及它依赖于哪些具体…

TensorFlow 示例摄氏度到华氏度的转换(一)

TensorFlow 实现神经网络模型来进行摄氏度到华氏度的转换&#xff0c;可以将其作为一个回归问题来处理。我们可以通过神经网络来拟合这个简单的转换公式。 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与预测 7. 保存与加载模型 …

gitea - fatal: Authentication failed

文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…