【刷题之路】LeetCode232——用栈实现队列

news2025/1/6 19:59:35

一、题目描述

原题链接:https://leetcode.cn/problems/implement-queue-using-stacks/

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(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 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

二、解题

思路分析:栈是先进后出,队列是后进先出,是完全相反的性质,如果要用栈实现队列,那么肯定需要两个栈来实现。

因为性质相反,所以两个栈之间肯定有倒数据的过程,接下来我们用动图来诠释大概过程

一个栈专门入数据,记为pushst,一个栈专门出数据,记为popst

入数据的时候只往pushst入,出数据的时候先判断popst为不为空,不为空直接出栈顶元素,为空将pushst倒空再出popst栈顶元素 

经过这样的操作我们就会发现将栈的元素倒置了,也就间接实现了队列的性质——先进先出

因为本小白还没开始系统地学习c++的内容,所以这里的栈采用的是之前c语言实现的栈,相关接口在之前的博客,需要的小伙伴们可以自取:https://blog.csdn.net/fight_for1/article/details/130677877?spm=1001.2014.3001.5501

有了思路,代码实现起来也就水到渠成了

代码实现

typedef struct {
 SLtack Pushtack;
 SLtack Poptack;
} MyQueue;


MyQueue* myQueueCreate() {
  MyQueue* obj=(MyQueue*)malloc(sizeof(MyQueue));
  StackInit(&obj->Pushtack);
  StackInit(&obj->Poptack);
  return obj;
}

void myQueuePush(MyQueue* obj, int x) {
    StackPush(&(obj->Pushtack),x);
}

int myQueuePop(MyQueue* obj) {
   if(StackEmpty(&(obj->Poptack)))//如果POP栈为空,那么需要将Push栈的数据压入Pop栈中
   {
        while(!StackEmpty(&(obj->Pushtack)))
      {
        StackPush(&(obj->Poptack),StackTop(&(obj->Pushtack)));
        StackPop(&(obj->Pushtack));
      }
   }
   int pop=StackTop(&(obj->Poptack));
   StackPop(&(obj->Poptack));
   return pop;
}

int myQueuePeek(MyQueue* obj) {
 if(StackEmpty(&(obj->Poptack)))//如果POP栈为空,那么需要将Push栈的数据压入Pop栈中
   {
        while(!StackEmpty(&(obj->Pushtack)))
      {
        StackPush(&(obj->Poptack),StackTop(&(obj->Pushtack)));
        StackPop(&(obj->Pushtack));
      }
   }
   return StackTop(&(obj->Poptack));
}

bool myQueueEmpty(MyQueue* obj) {

   if(StackEmpty(&(obj->Pushtack))&&StackEmpty(&(obj->Poptack)))
   return true;
   else
   return false;
}

void myQueueFree(MyQueue* obj) {
    //先free掉栈,再free掉obj
    StackDestroy(&(obj->Pushtack));
    StackDestroy(&(obj->Poptack));
    free(obj);
}

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

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

相关文章

深拷贝/浅拷贝精讲

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

Java 中Spring Security 是什么?如何使用

简介 Spring Security是一款基于Spring框架的安全框架,它提供了一系列的功能和API,用于保护Web应用程序和REST API的安全性。Spring Security可以提供身份验证、授权、加密和防止攻击等功能。它是Spring框架的一部分,可以与Spring框架无缝集…

Redis3种特殊数据结构详解

1、Bitmap位存储 Bitmap存储的是连续的二进制数字(0和1)。 你可以将Bitmap看作是一个存储二进制数字(0和1)的数组,数组中每个元素的下标叫做offset(偏移量)。 应用场景,需要保存状态…

​Cloud Studio 云端开发保障企业源代码安全

为什么需要保证 企业源代码安全 随着时代的发展,各行各业的企业或多或少都会与软件源代码打交道,借助软件系统更好地提升企业办公效率,而软件的源代码也自然成了一种企业新型资产。如何确保企业源代码不外泄,成为了各个企业特别关…

scau 拓扑排序

18734 拓扑排序 时间限制:1000MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC Description 在经历.....之后,你打算好好学习下计算机专业的课程,避免面试过程中的各种尴尬场面。 计算机的专业课程间既有循序渐进的特点&…

解决方案 自动测试平台 通用测试平台

“通用测试平台”是针对测试保障所需研制的小型化、通用化、平台化综合保障设备。它采用可灵活扩展、剪裁和重构的开放式体系结构,支持用户对测试资源进行快速地剪裁或扩展,结合功能强大灵活的软件平台,能够支持多种被测件的测试和故障诊断。…

电赛E题声源定位跟踪系统制作全过程

声源定位 文章目录 声源定位前言一、题目二、设计步骤1.设计思路2.声源追踪定位的分析3.舵机转角的确定4.声源距离的计算 三、代码编写1.求均值2.卡尔曼滤波 复刻一下电赛的声源定位 前言 2023年的电子设计竞赛快要开始了,同时我也已经大三下了正在准备找工作&…

Mybatis之配置解析

目录 核心配置文件 environments(环境配置) properties(属性) typeAliases( 类型别名) 映射器 注解开发 Mybatis执行流程 核心配置文件 mybatis-config.xml configuration(配置) pr…

【STM32】STM32使用RFID读卡器

STM32使用RFID读卡器 RFID卡片 ID卡(身份标识):作用就是比如你要输入学号,你刷卡直接就相当于输入学号,省去了输入的过程 IC卡:集成电路卡,是将一种微电子芯片嵌入卡片之中 RFID的操作 1、…

【C++学习】模板初阶

目录 一、泛型编程 二、函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 三、类模板 3.1 类模板的定义格式 3.2 类模板的实例化 一、泛型编程 我们前面学习了C的函数重载功能,那么我们如何实现…

低调的接口工具 ApiKit

最近发现一款接口测试工具--ApiKit,我们很难将它描述为一款接口管理工具 或 接口自测试工具。 官方给了一个简单的说明,更能说明 Apikit 可以做什么。 ApiKit API 管理 Mock 自动化测试 异常监控 团队协作 ApiKit的特点: 接口文档定义&a…

多层级缓存

多级缓存 多级缓存方案 多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务器性能: 用作缓存的Nginx是业务Nginx,需要部署为集群,再有专门的Nginx用来做反向代理:…

ModStartCMS v6.4.0 模块市场升级,UI界面优化

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用,支持后台一键快速安装,让开发者能快的实现业务功能开发。 系统完全开源,基于 Apache 2.0 开源协议,免费且不限制商业使用。 功能特性 丰富的模块市…

一文吃透 Vue 框架教程(上)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

phpstorm+xdebug的安装与使用

工具和环境 phpstorm 2018 php5.6 线程安全 xdebug 1.下载和安装xdebug 1.1 查看自己phpinfo信息 比如我这里是php 5.6 ,线程安全版本 1.2 xdebug 官网 Xdebug: Historical Releases 根据自己的php版本选择要下载的dll文件 如果是高版本一点的php &#xff…

Java基础面试题突击系列3

👩🏻 作者:一只IT攻城狮 ,关注我不迷路 ❤️《java面试核心知识》突击系列,持续更新… 💐 面试必知必会学习路线:Java技术栈面试系列SpringCloud项目实战学习路线 📝再小的收获x365天…

Qt实现DES ECB加密解密

环境&#xff1a;Windows11 64位 工具链&#xff1a;MinGW32 IDE&#xff1a;Qt 5.14 Qt使用DES加密需要用到OpenSSL库&#xff0c;首先要确定当前使用的Qt所支持的SSL版本。编译OpenSSL 查看当前Qt对OpenSSL的支持情况 qDebug() << QSslSocket::supportsSsl();返回 tr…

C++STL简介

本期我们来简单介绍一下STL 目录 1.什么是STL 2.STL的版本 3.STL的六大组件 4.如何学习STL 5.STL的缺陷 本期内容比较简单&#xff0c;大家只需简单看看了解一下即可 1.什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &…

Postman使用技巧

本文仅针对笔者的Postman使用习惯&#xff0c;纯属个人理解&#xff0c;如有不同或更好的方式烦请指出。 文章目录 前言一、Postman是什么&#xff1f;二、使用步骤1. Collection分级习惯2.配置环境变量3.Postman接口请求自带url前缀3.1 方式一&#xff1a;在url中添加环境变量…

深度学习框架搭建

5.15 首先是了解下&#xff0c;怎么配置环境啊这一套的。。 1.大概了解了一些名词意思 python&#xff0c;不用说了&#xff0c;就是一门语言 anoconda是一些包啊之类的管理工具&#xff0c;挺好用的&#xff0c;管理虚拟环境用的。 jupyter和pycharm都是类似于IDE吧&#…