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

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.kler.cn/a/329837.html

相关文章:

  • 爬虫基础学习
  • 光伏储能电解水制氢仿真模型Matlab/Simulink
  • 【c++】哈希
  • 3 前端(上): Web开发相关概念 、HTML语法、CSS语法
  • 目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析
  • SQL Prompt 插件
  • 【JWT安全】portswigger JWT labs 全解
  • 《武汉大学学报(理学版)》
  • linux中bashrc和profile环境变量在Shell编程变量的传递作用
  • 腾讯云SDK产品功能
  • npm与包
  • 攻防世界---->SignIn
  • 51c自动驾驶~合集1
  • OpenGL笔记十九之相机系统
  • 【C#生态园】后端服务与网络库:选择适合你游戏开发的利器
  • Azure DevOps Server:不能指派新增的用户
  • 【Kubernetes】常见面试题汇总(四十三)
  • VSOMEIP代码阅读整理(1) - 网卡状态监听
  • OpenCV视频I/O(10)视频采集类VideoCapture之从视频流中检索一帧图像函数 retrieve()的使用
  • 如何使用 DomCrawler 进行复杂的网页数据抓取?
  • 正则表达式(补充)
  • 基于SSM+微信小程序的校园二手数码交易平台系统(二手3)(源码+sql脚本+视频导入教程+文档)
  • Windows 环境搭建 CUDA 和 cuDNN 详细教程
  • 大数据毕业设计选题推荐-重庆旅游景点数据分析系统-Python-Hive-Hadoop-Spark
  • Git 与 GUI 工具
  • STM32的ADC技术详解