【算法与数据结构】225、LeetCode用队列实现栈

news2024/9/20 22:34:40

文章目录

  • 一、题目
  • 二、解法
  • 三、完整代码

所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。

一、题目

在这里插入图片描述在这里插入图片描述

二、解法

  思路分析第一种解法是利用两个队列,一个用作输出队列,一个用作备份队列。主要难点在于pop函数的实现:先将que1除了最后面元素以外的元素全部复制到que2中,然后pop que1最后面的元素,再将其他元素从que2重新复制到que1中来。
  程序如下

// 用两个队列实现栈
class MyStack{
public:
    queue<int> que1;    // 输出队列
    queue<int> que2;    // 备份队列
    MyStack() { // 构造函数

    }

    void push(int x) {
        que1.push(x);
    }

    int pop() {
        int size = que1.size();
        size--;
        while (size--) {
            que2.push(que1.front());    // 将que1队列里的除了队尾元素以外的元素全部复制到que2中
            que1.pop();
        }
        int res = que1.front();         // 然后输出que1队尾元素
        que1.pop();
        que1 = que2;                    //再将que2元素全部复制回que1        
        while (!que2.empty()) {
            que2.pop();
        }
        return res;
    }

    int top() {
        return que1.back();
    }

    bool empty() {
        return que1.empty();
    }
};

复杂度分析:

  • 时间复杂度: pop函数是 O ( n ) O(n) O(n),其他函数为 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( n ) O(n) O(n)

  另外一种解法是只使用一个队列实现。主要思想是在push时,将元素排列好,队尾最后一个元素以外的元素出队,然后在入队,这样一来,队尾的最后一个元素就在队头,实现了栈后进先出的原理

// 用一个队列实现栈
class MyStack {
public:
    queue<int> que;     // 输出队列
    MyStack() {         // 构造函数

    }
    void push(int x) {
        que.push(x);
        // 将队列按后进在前的顺序排好,然后队列是在前的元素先出,实现栈后进先出的原理
        for (int i = 0; i < que.size() - 1; i++) {
            que.push(que.front());      // 入队
            que.pop();                  // 出队
        }
    }
    int pop() {
        int res = que.front();
        que.pop();
        return res;
    }
    int top() {
        return que.front();
    }
    bool empty() {
        return que.empty();
    }
};

复杂度分析:

  • 时间复杂度: push函数是 O ( n ) O(n) O(n),其他函数为 O ( 1 ) O(1) O(1)
  • 空间复杂度: O ( n ) O(n) O(n)

三、完整代码

# include <iostream>
# include <queue>
using namespace std;

 用两个队列实现栈
//class MyStack{
//public:
//    queue<int> que1;    // 输出队列
//    queue<int> que2;    // 备份队列
//    MyStack() { // 构造函数
//
//    }
//
//    void push(int x) {
//        que1.push(x);
//    }
//
//    int pop() {
//        int size = que1.size();
//        size--;
//        while (size--) {
//            que2.push(que1.front());    // 将que1队列里的除了队尾元素以外的元素全部复制到que2中
//            que1.pop();
//        }
//        int res = que1.front();         // 然后输出que1队尾元素
//        que1.pop();
//        que1 = que2;                    //再将que2元素全部复制回que1        
//        while (!que2.empty()) {
//            que2.pop();
//        }
//        return res;
//    }
//
//    int top() {
//        return que1.back();
//    }
//
//    bool empty() {
//        return que1.empty();
//    }
//};

// 用一个队列实现栈
class MyStack {
public:
    queue<int> que;     // 输出队列
    MyStack() {         // 构造函数

    }
    void push(int x) {
        que.push(x);
        // 将队列按后进在前的顺序排好,然后队列是在前的元素先出,实现栈后进先出的原理
        for (int i = 0; i < que.size() - 1; i++) {
            que.push(que.front());      // 入队
            que.pop();                  // 出队
        }
    }
    int pop() {
        int res = que.front();
        que.pop();
        return res;
    }
    int top() {
        return que.front();
    }
    bool empty() {
        return que.empty();
    }
};

int main()
{
    MyStack* obj = new MyStack();
    obj->push(10);
    obj->push(20);
    int param_2 = obj->pop();
    cout << "param_2:" << param_2 << endl;
    int param_3 = obj->top();
    cout << "param_3:" << param_3 << endl;
    bool param_4 = obj->empty();
    cout << "param_4:" << param_4 << endl;
    system("pause");
    return 0;
}

end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/729631.html

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

相关文章

<Java导出Excel> 4.0 Java实现Excel动态模板字段增删改查

思路&#xff1a; 主要是同时操作两张表&#xff1a;一张存储数据的表&#xff0c;一张存储模板字段的表&#xff1b; 查询&#xff1a;只查询模板字段的表&#xff1b; 新增&#xff0c;修改&#xff0c;删除&#xff1a;需要同时操作两张表中的字段 如果两张表字段不一致&…

51单片机--点亮LED灯和流水灯

文章目录 前言LED模块的原理点亮一个LED灯LED灯的闪烁LED流水灯 前言 大家好&#xff0c;这里是诡异森林。我使用的是普中科技的A2的51开发板&#xff0c;适合新手入门。用到的应用是Keil5和Stc-isp&#xff0c;第一个软件主要用来写代码的&#xff0c;第二个是将代码程序输送…

RocketMQ5.0--部署与实例

RocketMQ5.0–部署与实例 一、Idea调试 1.相关配置文件 在E:\rocketmq创建conf、logs、store三个文件夹。从RocketMQ distribution部署目录中将broker.conf、logback_namesrv.xml、logback_broker.xml文件复制到conf目录。如下图所示。 其中logback_namesrv.xml、logback_b…

2.2.cuda驱动API-初始化和检查的理解,CUDA错误检查习惯

目录 前言1. cuInit-驱动初始化2. 返回值检查总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 案例…

氢燃料电池汽车储氢技术及其发展现状

摘要&#xff1a; 氢能的发展可有效地解决经济发展和生态环境间日益增长的矛盾。氢燃料汽车将处于氢能产业体系中核心地位&#xff0c;加快对氢燃料电池车的技术研发&#xff0c;大范围提高氢能源利用率&#xff0c;对于全世界形成以低碳排放为特征的工业体系具有重要意义。在…

【数据库】忘记mysql本地密码

目录 说明 操作步骤操作失败解决1.在以上操作步骤的第四步&#xff0c;输入mysql&#xff0c;报错第一种报错解决办法如下 第二种报错解决办法如下 2.从上面操作第二步后重新操作步骤如下报错解决办法如下 参考链接 说明 太久没使用本地mysql数据库&#xff0c;忘记了密码。 …

禅意工作-诗意生活

“禅意工作&#xff0c;诗意生活”能做到这两点&#xff0c;非常非常非常难。 AI的解释&#xff1a; “禅意工作&#xff0c;诗意生活”是一种追求内心平和与幸福的生活方式&#xff0c;它将工作与生活相结合&#xff0c;达到一种和谐的状态。以下是一些关于如何实现“禅意工…

GitHub快速上手--GitHub高效操作教程

一、前言 如果你正在看我的这篇文章&#xff0c;说明你已经对GitHub有了一些基础的了解&#xff0c;下面我们将详细叙述每一步的操作&#xff0c;以保证你能够快速上手GitHub&#xff0c;完成对代码的管理。 二、创建仓库 登录GitHub账号&#xff0c;点击页面右上角的加号&am…

flutter聊天界面-自定义表情键盘实现

flutter聊天界面-自定义表情键盘实现 flutter 是 Google推出并开源的移动应用开发框架&#xff0c;主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App&#xff0c;一套代码同时运行在 iOS 和 Android平台。 flutter开发基础腾讯IM的聊天应用&#xff0c;使用的是t…

PADS Layout中显示与布线标签页参数设置

1.“显示”标签页如图1 所示&#xff1a; 图1 显示标签页 显示标签页是用于去设置网络名以及管脚编号的字体大小的设置&#xff0c;建议是可以采取默认设置的&#xff0c;如果自己设计有另外要求&#xff0c;也是可以去进行设置。 2.“布线”标签也有三个子标签&#xff0c;首先…

基于matlab使用两个图像估计校准相机的姿势(附源码)

一、前言 运动结构 &#xff08;SfM&#xff09; 是从一组 3-D 图像估计场景的 2-D 结构的过程。此示例演示如何从两个图像估计校准相机的姿势&#xff0c;将场景的三维结构重建为未知比例因子&#xff0c;然后通过检测已知大小的对象来恢复实际比例因子。 此示例演示如何从使…

2.标识符、关键字、保留字

1、标识符 标识符&#xff1a;就是指开发人员为变量、属性、函数、参数取的名字 注意&#xff1a;标识符不能是关键字或保留字 JavaScript标识符 在JavaScript中&#xff0c;标识符&#xff08;Identifier&#xff09;是用于标识变量、函数、对象、属性或其他编程元素的名称。…

如何实现CesiumJS的视效升级?

CesiumJS作为一款强大的地理可视化引擎&#xff0c;为我们提供了丰富的地球数据可视化和交互展示的能力。然而&#xff0c;随着用户需求的不断增加和技术的不断进步&#xff0c;如何进一步提升CesiumJS的视觉效果成为了一个重要的问题。 首先&#xff0c;为了实现CesiumJS视觉…

Docker(二)之容器技术所涉及Linux内核关键技术

容器技术所涉及Linux内核关键技术 一、容器技术前世今生 1.1 1979年 — chroot 容器技术的概念可以追溯到1979年的UNIX chroot。它是一套“UNIX操作系统”系统&#xff0c;旨在将其root目录及其它子目录变更至文件系统内的新位置&#xff0c;且只接受特定进程的访问。这项功…

国内几款常用热门音频功放芯片-低功耗、高保真

音频功放芯片&#xff0c;又称为音频功率放大器芯片&#xff0c;是指一种将音频信号转换成线性的输出功率的集成电路芯片&#xff0c;在音频功放领域中一类是传统意义上的模拟功放&#xff1b;另一类是数字功放&#xff0c;它们都可以实现模拟信号到数字信号的转换。 随着智能…

[Java基础] StringBuffer 和 StringBuilder 类应用及源码分析

系列文章目录 [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析 [Java基础] 数组应用及源码分析 [Java基础] String&#xff0c;分析内存地址&#xff0c;源码 文章目录 系列文章目录前言1、特性1.1、操作StringBuffer不会生成新的对象1.2、对比操作String会生成新…

el-tab-pane 和el-tooltip及el-tree 组合使用

<el-tabs v-model"groupId" tab-click"handleClick"><el-tab-pane label"全部" name"0"></el-tab-pane><el-tab-pane v-for"items in editableTabs" :key"items.group_id" :name"item…

Rust环境配置

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

动态规划之 70爬楼梯(第2道)

题目&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例&#xff1a; 解法&#xff1a; class Solution { public:int climbStairs(int n) {vector<int> dp(n1);//n1个数…

IDEA+SpringBoot+mybatis+SSM+layui+Mysql学生学籍管理系统

IDEASpringBootmybatisSSMlayuiMysql学生学籍管理系统 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.专业管理3.班级管理4.学生管理5.老师管理6.公告管理7.课程管理8.开课管理9.用户管理 三、部分代码UserDao.javaUserController.javaUser.java 四、其他获取源码 一、系…