C++用两个栈实现队列

2023-11-19

1. 基础

  1. 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行;

  2. 栈:后进先出,即插入与删除数据均在栈顶进行。

2. 思路

两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈。

  1. 只要是对队列进行push操作,就将数据push入pushStack栈中。
  2. 要实现队列的pop操作,有二点原则,如果popStack为空的话那么我们就将pushStack所有的元素放到popStack中,然后取popStack栈顶元素就是队列的队头;如果popStack不为空的话,我们就直接获取popStack的栈顶元素。
  3. 对于top操作来说和pop操作类似,只是最后一步不用pop了。

在这里插入图片描述

3. 代码

#include <iostream>
#include <stack>
#include <exception>

template<class T> class MyQueue {
 public:
     void push(const T& num);   // 入队列
     T pop();   // 出队列
     T top();
 private:
    std::stack<T> pushStack;
    std::stack<T> popStack;
};
template<typename T>
void MyQueue<T>::push(const T& num) {
    pushStack.push(num);
}
template<typename T>
T MyQueue<T>::pop() {
    if (pushStack.empty() && popStack.empty()) {    // 如果二个栈都为空
        throw std::runtime_error("queue is empty");
    } else if (popStack.empty()) {  // 如果popStack为空,将pushStack全部元素倒popStack
        while (!pushStack.empty()) {
            T data = pushStack.top();   // 获取pushStack栈顶元素
            pushStack.pop(); // 出栈
            popStack.push(data);
        }
    }
    T data = popStack.top();
    popStack.pop();
    return data;
}
template<typename T>
T MyQueue<T>::top() {
    if (pushStack.empty() && popStack.empty()) {    // 如果二个栈都为空
        throw std::runtime_error("queue is empty");
    } else if (popStack.empty()) {  // 如果popStack为空,将pushStack全部元素倒popStack
        while (!pushStack.empty()) {
            T data = pushStack.top();   // 获取pushStack栈顶元素
            pushStack.pop(); // 出栈
            popStack.push(data);
        }
    } else {    // 如果popStack不为空的话直接返回popStack栈顶
        T data = popStack.top();
        return data;
    }
}
int main() {
    MyQueue<int> myQueue1;
    myQueue1.push(1);
    myQueue1.push(2);
    myQueue1.push(3);
    myQueue1.push(4);
    std::cout << "current pop is:" << myQueue1.pop() << std::endl;
    std::cout << "current pop is:" << myQueue1.pop() << std::endl;
    std::cout << "current pop is:" << myQueue1.pop() << std::endl;
    std::cout << "current pop is:" << myQueue1.pop() << std::endl;
    std::cout << "current pop is:" << myQueue1.pop() << std::endl;

    return 0;
}

在这里插入图片描述

4. 参考文献

  1. 用两个栈实现一个队列——我作为面试官的小结
  2. C++之用两个栈实现一个队列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++用两个栈实现队列 的相关文章

  • “do { ... } while (0)”在内核代码中到底做了什么? [复制]

    这个问题在这里已经有答案了 可能的重复 当我们定义宏时 do while 0 有什么用 https stackoverflow com questions 923822 whats the use of do while0 when we
  • 将按钮控件嵌入到现有 Direct3D 应用程序中

    我想将自己的内容覆盖在 Direct3D v9 游戏 由第三方制作 之上 叠加互动按钮 具体来说 我想覆盖一个可点击的按钮控件 就像 Steam 所做的那样 尽管我正在尝试一个更简单的界面 理想情况下 我能够覆盖 WPF 按钮或 Windo
  • 浮点等于的意外结果

    问题不在于为什么0 1 0 9不等于1 0 这是关于平等者的不同行为 有人可以解释为什么下面的示例的工作方式不同 float q 0 1f float w 0 9f float summ q w q w 1 0f False summ 1
  • 为什么json序列化器不符合多态性?

    我在 NET 4 5 Windows 应用商店应用程序中使用库存 JSON 序列化器 System Runtime Serialization Json DataContractJsonSerializer 我有一个由 API 提供商提供的
  • 不带()的sizeof有什么作用? [复制]

    这个问题在这里已经有答案了 作者是这个问题 https stackoverflow com questions 18898410 2 dimensional array simple understanding当我问他什么时 他只是取笑我s
  • 调用事件,h(args) 与 EventName?.Invoke()

    我总是这样调用事件 void onSomeEvent string someArg var h this EventName if h null h this new MyEventArgs someArg 今天 VS 2015 告诉我这可
  • 将一个文件写入.c中的另一个文件

    我有一个读取文件然后将其内容复制到另一个文件的代码 我需要使其仅复制每 20 个符号 然后跳过 10 个符号 然后再次跳过 20 个符号 依此类推 我必须使用 lseek 函数 但我不知道如何将所有这些放入循环中来执行此操作 main ar
  • 尝试使用指向 ODBC DSN 的连接字符串时出现关键字不支持异常

    我为我的 Asp Net MVC 应用程序的数据库访问创建了一个 ODBC DSN 主要原因之一是它可以轻松地将数据库凭据 例如服务器地址 端口 用户名和密码 置于源代码控制之外 而不会妨碍我的发布能力 所以我将连接更改为DSN MyDSN
  • 了解 Windows 8 上的文件何时发生更改

    我知道 FileSystemWatcher 类在 Windows 8 上不起作用 为什么在 Windows 7 上检测到 FileSystemWatcher 属性更改 而在 Windows 8 上检测不到 https stackoverfl
  • 如何使用可变参数模板声明 std::tuple?

    也许我在这里很天真 但我相信以下代码应该编译 template
  • 从 C++ 中的 std::string 获取字节

    我正在一个 C 非托管项目中工作 我需要知道如何获取像 一些要加密的数据 这样的字符串并获取一个 byte 数组 我将用它作为加密的源 在 C 中我做 for int i 0 i lt text Length i buffer i byte
  • 如何使用 Moq 模拟 Web 服务调用?

    The using下面点击了我不想实际点击的外部资源 我想测试someResult以及使用它的代码 但每次我运行单元测试时 该代码仍然尝试访问真正的 Web 服务 如何使用最小起订量来伪造对 Web 服务的真实调用 但不模拟使用中的其余代码
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 如何测试抽象类的受保护抽象方法?

    我一直在研究测试名为的抽象类的最佳方法TabsActionFilter 我保证继承自的类TabsActionFilter将有一个名为GetCustomer 在实践中 这种设计似乎效果很好 我遇到的一些问题是弄清楚如何测试OnActionEx
  • winapi 函数的函数指针 (stdcall/cdecl)

    请有人给我一些为 MS winapi 函数创建函数指针的提示吗 我试图为 DefWindowProc DefWindowProcA DefWindowProcW 创建一个指针 但出现此错误 LRESULT dwp HWND UINT WPA
  • Fluent NHibernate 一对一映射

    我很难利用 Fluent NHibernate 的 HasOne 映射 基本上 A 类在 B 类中可以有匹配的 只有一条或没有 记录 请帮助定义关系的 AMap 和 BMap 类 谢谢 public class A public virtu
  • ThemeInfo 属性有什么用?

    每当我创建新的 WPF 应用程序或 WPF 用户控件库时 AssemblyInfo cs文件包含以下属性 assembly ThemeInfo ResourceDictionaryLocation None where theme spec
  • thread_local成员变量构造

    我遇到了 thread local 的一些奇怪行为 不确定我是否做错了什么或者这是一个 GCC 错误 我有以下最小重现场景 include
  • K&R 之后用什么书来学习纯 C 编程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • .NET Web API - 添加日志记录

    我正在寻找有关处理 API 日志记录的最佳方法的帮助 我想将所有请求和响应记录到 sql 或文本文件 如果这是最好的方法 目前我已经在 SQL Server 的日志表中插入一行 我使用名为 LogAction 的静态方法来执行此操作 并在

随机推荐

  • 服务器柜机位置摆放电子图,客厅柜机摆放—客厅柜机空调摆放方法介绍

    客厅是一家人在一起活动最多的房间 所以家具及家电等产品的摆放就要有一定的讲究了 其中柜机空调的摆放方法尤其为消费者所关注 下面 小编就详细的向您介绍一下客厅柜机摆放的方法 有兴趣的朋友一起来了解一下吧 客厅柜机摆放 客厅柜机摆放 正确摆放位
  • VectorCAST软件下载安装使用试用培训购买

    商业软件如需下载安装使用试用 可以通过下面添加 提供编译器定制 技术支持 培训 wanglequshuijiao 有需要可以加详细聊 vx 静态测试软件 QAC Klocwork Coverity等 单元测试软件 集成测试软件 Vector
  • 超详细!Jmeter性能测试(二)

    Jmeter 性能测试 二 关联 正则表达式提取器和JSON Extractor提取器 接入上篇博文继续 上篇地址 https blog csdn net weixin 44954642 article details 103054387
  • MySQL几种创建索引的方式

    一 创建表时创建索引 key 索引名 column 二 表创建好后创建索引 1 通过Alter创建索引 PRIMARY KEY 主键索引 mysql gt ALTER TABLE table name ADD PRIMARY KEY col
  • 设计模式七大原则

    1 设计模式的目的 编写软件过程中 程序员面临着来自耦合性 内聚性以及可维护性 可扩展性 重用性 灵活性 等多方面的挑战 设计模式是为了让程序 软件 具有更好 1 代码重用性 即 相同功能的代码 不用多次编写 2 可读性 即 编程规范性 便
  • npm插件安装插件失败问题解决办法

    目录 问题索引列表 错误记录 在线地址pdf转word https www camscanner com pdftopic 问题索引列表 1 配置安装自定义位置nodejs 1 1 使用npm安装模块的位置有默认安装位置和指定安装位置 在W
  • Java自学第15天 面向对象(全)

    面向过程 面向对象 面向过程思想 步骤清晰简单 第一步做什么 第二步做什么 面对过程适合处理一些较为简单的问题 面向对象思想 物以类聚 分类的思维模式 思考问题首先会解决问题需要哪些分类 然后对这些分类进行单独思考 最后 才对某个分类下的细
  • javaSE进阶1之static用法

    JavaSE进阶 静态关键字 static static关键字的作用 成员变量分类 静态成员变量 实例成员变量 static修饰成员变量内存原理 static 修饰成员方法的基本用法 成员方法的分类 static修饰成员方法内存原理 sta
  • [原]Pro*C介绍-内嵌SQL

    Translate by Z Jingwei Document address http www db stanford edu ullman fcdb oracle or proc html Pro C介绍内嵌SQL 概要 Pro C语法
  • selenium自动化测试实战

    一 Selenium介绍 Selenium 是什么 一句话 自动化测试工具 它支持各种浏览器 包括 Chrome Safari Firefox 等主流界面式浏览器 如果你在这些浏览器里面安装一个 Selenium 的插件 那么便可以方便地实
  • Java开发中关于实体类的一些注解

    JSONField注解 FastJson中的注解 JSONField 一般作用在get set方法 常用的有以下三个场景 修改字段映射 private String name 实体类序列化为json字符串的时候 该类的name字段 序列化为
  • Integer 和 int

    一 区别 1 Integer是int的包装类 int则是java的一种基本的数据类型 2 Integer变量必须实例化之后才能使用 而int变量不需要实例化 3 Integer实际是对象的引用 当new一个Integer时 实际上生成一个指
  • Hadoop的安装与调试(2)

    本节内容包括 虚拟机的克隆 虚拟机配置 虚拟机IP配置 windows网络配置 虚拟机重命名 固定IP映射 设置mac地址 配置静态IP 测试 进入虚拟机 先登录用户 接下来用以下命令创建三个文件夹 四 虚拟机的克隆 1 先关闭虚拟机 2
  • 一文搞定attntion机制在CNN中的应用,手把手教你在Yolov5中插入attention. Attention结构的创新方法

    免责声明 1 此方法仅提供参考 2 搬了其他博主的操作方法 以贴上路径 3 场景一 什么是Attention 场景二 Attention在cnn上的作用 场景三 常见的Attention机制 场景四 Attention机制的创新思路 场景五
  • HTTP Status 500 - Request processing failed; nested exception is java.lang.IllegalArgumentException:...

    1 HTTP Status 500 Request processing failed nested exception is java lang IllegalArgumentException Control character in
  • U盘在别人电脑上正常显示,插在自己电脑读不出来(只显示CD驱动器)

    问题 同事A用U盘 从同事B电脑上拷贝文件 U盘插在其他同事电脑上都正常使用 插回自己电脑上读不出来 或者只显示CD驱动器 原因 种情况是驱动程序问题导致 可以把U盘插入电脑然后在设备管理里删掉设备重新插入即可 解决步骤 1 插上U盘 2
  • LLM大语言模型-MOSS解读

    原始blog在 notion 中 这里帖一个 notion的链接吧 LLM大语言模型 MOSS解读
  • VsFTP离线安装

    vsftp离线安装 安装包链接 https pan baidu com s 1qNmXWh3Ks5bzc rn1ytchQ 提取码 397i 1 查看服务器是否安装FTP 如图则表示没有安装 Shell gt rpm qa grep vsf
  • 云端开发加速是否可持续?

    云是否已经崛起还有待讨论 但是 目前 大多数开发项目都是在云端进行的 无论是纯云还是混合云 2022 年 Pluralsight 的一项研究表明 75 的组织都在云上构建新产品 云的优势显而易见 几乎无限的容量以及几秒内即可实现的按需扩展
  • C++用两个栈实现队列

    1 基础 队列 先进先出 即插入数据在队尾进行 删除数据在队头进行 栈 后进先出 即插入与删除数据均在栈顶进行 2 思路 两个栈实现一个队列的思想 用pushStack栈作为push数据的栈 用popStack栈作为pop数据的栈 只要是对