leetcode经典例题之使用栈实现队列

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

目录

  • 1、题目展示
  • 2、题目分析
  • 3、完整代码演示
  • 4、结语

1、题目展示

在这里插入图片描述


  前面我们了解过如何实现栈相关的代码,如果有遗忘或不熟悉可以回看:

     栈(使用顺序表构建)


  下面我们直接进入正文。



2、题目分析


  本题与博主前一篇博客中的使用队列实现栈有大相径庭的部分,但又有一些出入,我们知道栈与队列的区别是前者为后进先出,后者为先进先出,故当我们使用栈来实现队列相关的内容时,需要加以分析。
  我们同样的使用两个栈来进行队列功能的实现,假设一个场景,我们需要先将1,2,3,4四个数据输入至队列中,及s1或s2中(二者皆可)。

在这里插入图片描述
  当我们需要从由栈组成的队列中删除或哪取数据时,在栈先进先出的前提下,我们可以直接将s1中的4,3,2通过栈的输出导入至s2中。
在这里插入图片描述
  此时我们的s1中只剩下了数据1,这时候便可以直接进行取数据或删除数据的操作。
  此时我们假设将数据1删除后有插入了数据5和6,为了方便起见我们不再选择有数据的那一个栈来进行插入操作,反而使用没有数据的那一个,这样的情况下,如果我们需要继续输出或删除数据,我们便可以直接通过STTop对最先插入栈中的数据进行操作。


  既然这样,我们为了方便理解,不如将s1记作pushst,s2记作popst。便有了下图的结果。

在这里插入图片描述

  而判断队列是否为空的逻辑思路显而易见,直接判断两个栈是否都为空即可。




3、完整代码演示


  我们在完成这一道题目时,因为是oj题目,所以在需要完成的功能函数前需要自行书写栈的相关内容代码,故不在此展示,有需要者可在标题1中自行寻找link链接。
typedef int STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST,*pST;//初始化栈
void STInit(pST pst)
{assert(pst);pst->a = NULL;pst->top = 0;pst->capacity = 0;
}//销毁栈
void STDestroy(pST pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}//入栈
void STPush(pST pst, STDataType x)
{assert(pst);if (pst->top == pst->capacity){int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;STDataType* tmp = realloc(pst->a, newcapacity * sizeof(STDataType));if (tmp == NULL){perror("STPush:relloc");return;}pst->a = tmp;pst->capacity = newcapacity;}pst->a[pst->top] = x;pst->top++;
}//出栈
void STPop(pST pst)
{assert(pst);assert(pst->top > 0);pst->top--;
}//取栈顶数据
STDataType STTop(pST pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top - 1];
}//判断空
bool STEmpty(pST pst)
{assert(pst);return pst->top == 0;
}//数据个数
int STSize(pST pst)
{assert(pst);return pst->top;
}typedef struct 
{ST pushst;ST popst;
} MyQueue;MyQueue* myQueueCreate() 
{MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));STInit(&(obj->pushst));STInit(&(obj->popst));return obj;    
}void myQueuePush(MyQueue* obj, int x) 
{STPush(&(obj->pushst),x);
}int myQueuePop(MyQueue* obj) 
{int front = myQueuePeek(obj);STPop(&(obj->popst));return front;
}int myQueuePeek(MyQueue* obj) 
{if(STEmpty(&(obj->popst))){while(!STEmpty(&(obj->pushst))){STPush(&(obj->popst),STTop(&(obj->pushst)));STPop(&(obj->pushst));}}return STTop(&(obj->popst));
}bool myQueueEmpty(MyQueue* obj) 
{return STEmpty(&(obj->pushst)) && STEmpty(&(obj->popst));
}void myQueueFree(MyQueue* obj) 
{STDestroy(&(obj->pushst));STDestroy(&(obj->popst));free(obj);
}




4、结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。
;

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

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

相关文章

[力扣题解]406. 根据身高重建队列

题目:406. 根据身高重建队列 思路 贪心法; 本题涉及到2种选择因素:h和k; 优先考虑h,再考虑k; 如果在你的脑子里,这2个变量搅在一起就完蛋了 w(゚Д゚)w 代码 // 有2种因…

搭建nacos集群

1.修改nacos/conf/application.properties 2.在数据库中执行nacos/conf/nacos-mysql.sql脚本 3.修改nacos/conf/cluster.conf文件 4.修改startup.sh文件模式为集群 5.启动服务 附:安装nginx 修改/usr/local/openresty/nginx/conf/nginx.confi文件 http{}中增加如下…

电机控制系列模块解析(20)—— MTPA

一、MTPA MTPA 是 "Maximum Torque Per Ampere" 的缩写,意为“最大转矩电流比”。在电机控制系统中,特别是永磁同步电机(PMSM)或其它永磁电机的控制策略中,MTPA 控制旨在实现电机在给定负载条件下&#xff…

uniapp 生成安卓证书没有md5指纹怎么办?

由于最新的jdk版本对应的keystore工具无法查看到md5指纹信息 但是不代表它没有md5指纹信息,只是看不到而已 解决方案: 登录uniapp开发者后台生成安卓云端证书

【前端开发】Uniapp:uView组件库和封装接口请求

【uView组件库导入及使用】 1. 导入uView组件库依赖 &#xff08;无package.json&#xff09;npm init -ynpm install uview-ui1.8.8安装成功&#xff0c;自动放到“/node_modules/uview-ui/”&#xff08;可自行更换路径&#xff09; 2. 项目配置使用uView App.vue <style…

获取Linux上的Redis的用户名、密码、端口、host等信息

目录 进入redis-cli的目录 启动./redis-cli服务 查询密码 查询用户名 查询端口 查询host 参考文章&#xff1a;解决redis-cli连接时出现Could not connect to Redis at 127.0.0.1:6379: Connection refused-阿里云开发者社区 (aliyun.com) linux查看redis用户和密码_mo…

ChatGPT付费创作系统软件开发

uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 框架支持:springboot/Ssm/thinkphp/django/flask/express均支持 前端开发:vue.js 可选语言&#xff1a;pythonjavanode.jsphp均支持 运行软件…

【Spring Boot】Spring Boot 中的 Starter

Spring Boot 中的 Starter 1.常用 Starter2.为什么要用 Starter3.Starter 有哪些要素 我们都知道&#xff0c;Spring 的功能非常强大&#xff0c;但也有些弊端。比如&#xff1a;我们需要手动去配置大量的参数&#xff0c;没有默认值&#xff0c;需要我们管理大量的 jar 包和它…

【JS面试题】闭包

一、自由变量 在学习闭包之前&#xff0c;首先了解一下什么是自由变量&#xff1a; 一个变量在当前作用域&#xff08;比如函数内&#xff09;没有定义&#xff0c;但是被使用了&#xff0c;这个变量就是自由变量。在定义该函数的位置&#xff0c;向上级作用域&#xff0c;一…

Springboot整合向量数据库Milvus

Springboot整合向量数据库Milvus 导入依赖 <!--milvus 向量数据库 client sdk --><dependency><groupId>io.milvus</groupId><artifactId>milvus-sdk-java</artifactId

JavaScript 动态网页实例 —— 文字色彩与形状

首先介绍霓虹灯文字效果的设计,介绍文字色彩的静态渐变,然后介绍两个文字大小不断变化的示例,最后,则是两段文字色彩动态变化的代码。本章实例针对性较强,稍加修改就可以应用在网页中。读者不必拘泥于实例的效果,而应更重视实现这些效果的方法,相信这些实例能对开阔思路有…

【C++】STL — map和set的使用详细介绍

前言 本章将继续学习STL中的两个很重要的容器map和set&#xff0c;其底层实现是封装了一个红黑树&#xff0c;我们通过本节来学习和深入了解一下这两大容器。。。 序列式容器&#xff1a; string 、Vector、List 、dequeue 关联式容器&#xff1a;MAP 、SET、nordered_map、uno…

codeforce#939 (div2) 题解

C. Nene’s Magical Matrix 给一个nxn的矩阵&#xff0c;现在你可以执行一个操作&#xff1a;将数字1-n任意排列&#xff0c;并将这个序列覆盖到矩阵的任意一行或列。操作次数小于 2 n 2n 2n&#xff0c;求矩阵中元素和的最大值。 这个题显然存在一种巧妙的构造方法使得矩阵中…

软件设计各个阶段的成果

软件设计各个阶段的成果 1.可行性分析与项目开发计划2.需求分析3.系统设计4.系统测试运行和维护知识 自行整理的软件设计阶段性成果&#xff0c;如有不对的地方&#xff0c;欢迎指正。 1.可行性分析与项目开发计划 可行性分析报告项目开发计划 2.需求分析 软件需求说明书用…

MySql软件安装

1.打开mysql官网网址 MySQL :: Download MySQL Community Server 2.本次针对版本8的图形化界面安装&#xff0c;下载成功后接下来对MySQL进行安装 3.图形化下载后有一个MSI文件 4.我们安装典型即可&#xff0c;选择第一个 5.选择数据库信息存放的路径&#xff0c;我默认放在C盘…

springboot集成SpringIntegration

SpringIntegration的核心 Spring Integration的核心是消息驱动的架构。它提供了一种途径来将应用程序的各个组件&#xff08;例如&#xff1a;系统、服务、应用程序&#xff09;通过消息进行连接&#xff0c;从而实现系统的解耦和灵活性。Spring Integration基于企业集成模式&a…

Python 中字符串列表的排序

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 在 Python 中&#xff0c;列表中字符串元素的排序可以通过多种方式实现&#xff0c;主要依赖于 sort() 方法和 sorted() 函数。这两种方式都可以有效地对字符串列表进行排序&#xff0c;但它们在使用方…

十个简单的Python类的例子

十个简单的Python类的例子 涵盖了基本的类概念、实例属性、方法及一些高级应用。 内容从浅入深。 例子 1&#xff1a;定义一个简单的类 class Dog:def __init__(self, name):self.name namedef bark(self):return "Woof!"# 使用类 my_dog Dog("Buddy")…

如何解决pycharm在HTML文件中注释快捷键出错的问题(HTML注释规则出错)

文章目录 💢 问题 💢🏡 演示环境 🏡💯 解决方案 💯⚓️ 相关链接 ⚓️💢 问题 💢 你是否在编程时遇到过这样的烦恼?当你正专注地编写HTML代码,想要快速注释掉某部分内容时,却发现PyCharm的注释快捷键失灵了(没有使用正确的注释格式)。这不仅打断了你的工作…

每日一题10:Pandas:重塑数据-联结

一、每日一题 DataFrame df --------------------- | Column Name | Type | --------------------- | student_id | int | | name | object | | age | int | ---------------------DataFrame df --------------------- | Column Name | Type | --…