(第17天)【leetcode题解】232、用栈实现队列 225、用队列实现栈

2024-05-15 00:44

本文主要是介绍(第17天)【leetcode题解】232、用栈实现队列 225、用队列实现栈,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 232、用栈实现队列
    • 题目描述
    • 思路
    • 代码
  • 225、用队列实现栈
    • 题目描述
    • 思路
    • 代码

232、用栈实现队列

题目描述

  • 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

  • 实现 MyQueue 类:
    void push(int x) 将元素 x 推到队列的末尾
    int pop() 从队列的开头移除并返回元素
    int peek() 返回队列开头的元素
    boolean empty() 如果队列为空,返回 true ;否则,返回 false

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。

思路

  1. 用两个栈实现队列的功能,一个为输入栈stIn:用来实现队尾的push()功能;一个为输出栈stOut:用来实现队头的pop()功能。
  2. 在队尾插入元素时,直接用stIn进行push()操作即可。
  3. 在队头取出元素时,要先判断stOut是否为空,若为空,则把stIn中的元素全部导入stIn中,在进行pop()操作。
  4. peek()操作类似于pop()操作,在其中调用完pop()之后,再把取出的元素加回去即可。
  5. 当两个栈都为空时,队列判断为空。

代码

class MyQueue {
public:stack<int> stIn;//输入栈stack<int> stOut;//输出栈MyQueue() {}void push(int x) {stIn.push(x);}int pop() {//输出栈为空时,把输入栈中的所有数据全部导入输出栈if (stOut.empty()) {while (!stIn.empty()) {stOut.push(stIn.top());stIn.pop();}}int res = stOut.top();stOut.pop();return res;}int peek() {int res = this->pop();//使用已有的pop函数stOut.push(res);//取出了队头元素,再加进去return res;}bool empty() {return stIn.empty() && stOut.empty();}
};

时间复杂度:push和empty为O(1)、pop和peek为O(n);
空间复杂度:O(n);

225、用队列实现栈

题目描述

  • 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。

  • 实现 MyStack 类:
    void push(int x) 将元素 x 压入栈顶。
    int pop() 移除并返回栈顶元素。
    int top() 返回栈顶元素。
    boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

思路

  • 两个队列:que1、que2
  • que1用来进行输入输出操作、que2用于在栈pop()过程中对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--) {//将que1导入que2中,只留下一个元素que2.push(que1.front());que1.pop();}int res = que1.front();//留下的这个元素就是栈顶元素que1.pop();que1 = que2; //再将que2的值赋给que1while (!que2.empty()) {//清空que2中的元素que2.pop();}return res;}//获得栈顶元素int top() {return que1.back();}bool empty() {return que1.empty();}
};

时间复杂度:pop为O(n),其他为O(1);
空间复杂度:O(n);

这篇关于(第17天)【leetcode题解】232、用栈实现队列 225、用队列实现栈的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990319

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja