当前位置: 首页 > news >正文

03.04、化栈为队

03.04、化栈为队

1、题目描述

实现一个 MyQueue 类,该类用两个栈来实现一个队列。

2、解题思路

本题要求使用两个栈来实现一个队列。队列遵循先进先出(FIFO)的原则,而栈遵循后进先出(LIFO)的原则。因此,我们需要两个栈来模拟队列的行为:

  1. pushS:用于存储入队的元素。
  2. popS:用于反转元素顺序,以实现队列的出队操作。

3、解题步骤

  1. 入队操作 (push)
    • 将新元素直接压入到 pushS 栈中。
  2. 出队操作 (pop)
    • 检查 popS 栈是否为空:
      • 如果 popS 为空,将 pushS 中的所有元素逐个弹出并压入 popS。这一步将反转元素的顺序,从而实现队列的 FIFO 行为。
      • 如果 popS 不为空,直接弹出并返回 popS 的栈顶元素。
  3. 获取队首元素 (peek)
    • 类似于 pop 操作,只是我们不弹出 popS 栈的栈顶元素,而是返回它。
  4. 检查队列是否为空 (empty)
    • 队列为空的条件是 pushSpopS 都为空。

4、代码详解

class MyQueue {
private:stack<int> pushS; // 入队栈stack<int> popS;  // 出队栈public:MyQueue() {}void push(int x) { pushS.push(x); }int pop() {// 如果出队栈为空,将入队栈的所有元素移到出队栈中if (popS.empty()) {while (!pushS.empty()) {popS.push(pushS.top());pushS.pop();}}int ret = popS.top(); // 获取出队栈的栈顶元素popS.pop();           // 弹出该元素return ret;}int peek() {// 如果出队栈为空,将入队栈的所有元素移到出队栈中if (popS.empty()) {while (!pushS.empty()) {popS.push(pushS.top());pushS.pop();}}return popS.top(); // 返回出队栈的栈顶元素}bool empty() { return pushS.empty() && popS.empty(); }
};

5、时间复杂度

  • 入队操作 (push):O(1)
  • 出队操作 (pop):均摊 O(1),因为每个元素最多只会从 pushS 转移到 popS 一次。
  • 获取队首元素 (peek):均摊 O(1)
  • 检查队列是否为空 (empty):O(1)

6、空间复杂度

  • 使用了两个栈存储元素,空间复杂度为 O(n),其中 n 是队列中元素的数量。

这道题通过使用两个栈,成功模拟了队列的行为,展示了栈和队列之间的转换关系。

http://www.lryc.cn/news/469067.html

相关文章:

  • Coppelia Sim (v-REP)仿真 机器人3D相机手眼标定与实时视觉追踪 (二)
  • 苏州金龙技术创新赋能旅游新质生产力
  • ceph pg stale 恢复
  • Openlayers高级交互(8/20):选取feature,平移feature
  • uniapp renderjs页面传值
  • AI赋能R-Meta分析核心技术:从热点挖掘到高级模型、助力高效科研与论文发表
  • AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
  • 当事人单方委托专业机构或个人出具的书面意见,证据效力如何认定?
  • AUTOSAR CP 中 BswM 模块功能与使用介绍(2/2)
  • PCB电路板为什么大多是绿色的
  • Golang | Leetcode Golang题解之第508题出现次数最多的子树元素和
  • 【安全解决方案】深入解析:如何通过CDN获取用户真实IP地址
  • git 免密的方法
  • 如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14
  • hackme靶机渗透流程
  • uniapp 常用的地区行业各种多选多选,支持回显,复制粘贴可使用
  • iOS 本地存储地址(位置)
  • uni.showLoading 时禁止点击(防止表单重复提交) 小程序调取微信支付
  • OpenClash与Tailscale冲突得问题
  • day02|计算机网络重难点之HTTP请求报文和响应报文
  • Flutter之build 方法详解
  • 开源呼叫中心系统与商业软件的对比
  • 【人工智能】——matplotlib教程
  • 【c++ gtest】使用谷歌提供的gtest和抖音豆包提供的AI大模型来对代码中的函数进行测试
  • 使用Angular构建动态Web应用
  • 25届电信保研经验贴(自动化所)
  • 大数据-190 Elasticsearch - ELK 日志分析实战 - 配置启动 Filebeat Logstash
  • 不同类型的 LED 驱动电源在检测方法上有哪些不同?-纳米软件
  • android 生成json 文件
  • C++新增的类功能和可变参数模板