【LeetCode】数据结构题解(11)[用队列实现栈]

用队列实现栈

  • 😉 1.题目来源
  • 👀2.题目描述
  • 🤔3.解题思路
  • 🥳4.代码展示

在这里插入图片描述

所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️
😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘😘

😉 1.题目来源

LeetCode用队列实现栈
🚨注意:本题涉及到有关数据结构——队列和栈,这两章节的知识点,如有小伙伴还不熟栈的,可以先复习复习一下有关栈的相关知识,复习的地方我也提供了哦🙂,所用到的知识点——栈,所用到的知识点——队列
🚨注意:同样的本题是使用纯C语言实现的.

👀2.题目描述

请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。
实现 MyStack 类:
1.void push(int x) 将元素 x 压入栈顶。
2.int pop() 移除并返回栈顶元素。
3.int top() 返回栈顶元素。
4.boolean empty() 如果栈是空的,返回 true ;否则,返回 false 。

🚨注意:

  • 你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。
  • 你所使用的语言也许不支持队列。 你可以使用 list (列表)或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

在这里插入图片描述

🤔3.解题思路

  • 从题目要求我们知道,要用两个队列实现栈的功能,这个就是用队列实现栈
  • 开始做题之前我们首要的是明白队列和栈的特点。这里我们就简单的提一下,具体的知识请看上述给的链接。💯队列——队列的特性是👍先进的先出,就跟食堂打饭一样,先到的先打饭,打完饭就可以走了。栈——栈的特性是👍先进的后出,就跟我们在桌子上叠书一样,想要拿到最底下的书就要先把最上面的书先拿走。
  • 搞清楚特性之后,我们就可以开始分析了。首先无论是队列还是栈,插入数据都是往尾插入的,关键就是怎么使用队列实现栈的尾删。我们知道队列删除是头删,同样可以拿到头的数据,而且我们有两个队列,我们能不能先把第一个队列的(n-1)个数据放到另一个队列里面,再把最后剩下的那个数据删除,这个样子就实现了栈的尾删。那既然有两个队列,🤔怎么知道数据从那个队列放到那个队列里面去呢?💡这个简单只要判断两个队列那个为空,另一个数据不为空,就把数据放到为空的队列中去。

在这里插入图片描述

  • 🙂同时解释一下我们oj刷题的时出现的一些一些疑问

typedef struct {} MyStack;MyStack* myStackCreate() {}

这个是我们题目出现的函数接口,我来解释一下表示什么意思。

  1. 题目已经明确我们要使用两个链表来实现栈,所有我们就得创建两个队列的,而我们通常遇到这种两个及以上的要使用的成员时,👍为了减少传递的参数,以及代码的可读性简洁性,😮我们通常会用一个结构体把他们封装起来,所以我们的上述结构体就是用来创建两个队列的,并且这个结构体还是个匿名结构体,匿名结构体的特点就是只能用一次,这里我们只需要使用一次即可,所以匿名合理。
  2. 而另一个函数接口是用来初始化我们的结构体的,并返回结构体指针。🎇

🥳4.代码展示

//队列函数接口
typedef int QueueDataType;
typedef struct QueueNode
{struct QueueNode* next;QueueDataType data;
}QNode;typedef struct Node
{QNode* head;QNode* tail;int size;
}Node;void QueueInit(Node* pq);
void QueueDestroy(Node* pq);
void QueuePushu(Node* pq, QueueDataType x);
void QueuePop(Node* pq);
QueueDataType QueueFindFront(Node* pq);
QueueDataType QueueFindBack(Node* pq);
bool QueueEmpt(Node* pq);
int QueueSize(Node* pq);void QueueInit(Node* pq)
{assert(pq);pq->head = pq->tail = NULL;pq->size = 0;
}
void QueueDestroy(Node* pq)
{assert(pq);QNode* cur = pq->head;while (cur){QNode* next = cur->next;free(cur);cur = next;}pq->tail = pq->head = NULL;pq->size = 0;
}
void QueuePushu(Node* pq, QueueDataType x)
{assert(pq);QNode* newNode = (QNode*)malloc(sizeof(QNode));if (newNode == NULL){perror("malloc");exit(-1);}newNode->data = x;newNode->next = NULL;if (pq->tail == NULL){pq->tail = pq->head = newNode;}else{pq->tail->next = newNode;pq->tail = newNode;}pq->size++;
}
void QueuePop(Node* pq)
{assert(pq);assert(!QueueEmpt(pq));Node* next = pq->head->next;free(pq->head);pq->head = next;if (pq->head == NULL){pq->tail = NULL;}pq->size--;
}
QueueDataType QueueFindFront(Node* pq)
{assert(pq);assert(!QueueEmpt(pq));return pq->head->data;
}
QueueDataType QueueFindBack(Node* pq)
{assert(pq);assert(!QueueEmpt(pq));return pq->tail->data;
}
bool QueueEmpt(Node* pq)
{assert(pq);return pq->head == NULL;
}
int QueueSize(Node* pq)
{assert(pq);return pq->size;
}//函数实现
typedef struct {//创建两个队列Node q1;Node q2;
} MyStack;MyStack* myStackCreate() {MyStack* ret = (MyStack*)malloc(sizeof(MyStack));//初始化队列QueueInit(&ret->q1);QueueInit(&ret->q2);//返回结构体指针return ret;
}void myStackPush(MyStack* obj, int x) {//判断那个队列不为空,遍插入数据if (!QueueEmpt(&obj->q1)){QueuePushu(&obj->q1,x);}else{QueuePushu(&obj->q2,x);}
}int myStackPop(MyStack* obj) {//判断那个为空,(n-1)个数据放到空的队列中Node* empt = &obj->q1;Node* noEmpt = &obj->q2;if (!QueueEmpt(&obj->q1)){noEmpt = &obj->q1;empt = &obj->q2;}while (QueueSize(noEmpt)>1){QueuePushu(empt,QueueFindFront(noEmpt));QueuePop(noEmpt);}int top = QueueFindFront(noEmpt);QueuePop(noEmpt);return top;
}int myStackTop(MyStack* obj) {if (!QueueEmpt(&obj->q1)){return QueueFindBack(&obj->q1);}else{return QueueFindBack(&obj->q2);}
}bool myStackEmpty(MyStack* obj) {//两个队列为空才为空return QueueEmpt(&obj->q1) && QueueEmpt(&obj->q2);
}void myStackFree(MyStack* obj) {//显示放队列QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);//在释放结构体free(obj);
}

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

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

相关文章

C语言文件操作基本方法

1、文件的分类 ANSI C 的缓冲文件系统 缓冲文件系统 缓冲文件系统是指,系统自动地在内存区为每个正在使用的文件开辟一个缓冲区。 从内存向磁盘输出数据时,必须首先输出到缓冲区中。待缓冲区装满后,再一起输出到磁盘文件中。 从磁盘文件向内…

云原生周刊:KubeCon China 2023 详细议程公布 | 2023.8.7

开源项目推荐 Spiderpool Spiderpool 是一个 Kubernetes 底层网络解决方案。它提供丰富的 IPAM 功能和 CNI 集成能力,为开源社区的 CNI 项目提供支持,允许多个 CNI 有效协作。它能让底层 CNI 在裸机、虚拟机和任何公共云等环境中完美运行。 Preevy P…

Python爬虫的Selenium(学习于b站尚硅谷)

目录 一、Selenium  1.为什么要学习Selenium  (1)什么是Selenium  (2)为什么使用selenium?  (3)代码演示 2. selenium的基本使用  (1)如何安装selenium  (2…

探析STM32标准库与HAL库之间的差异与优劣

引言: 在嵌入式开发领域,STMicroelectronics的STM32系列芯片广受欢迎。STM32提供了两种主要的软件库,即标准库和HAL库,用于开发各种应用。本文将探讨这两种库之间的差异,比较它们的优劣,并分析在选择库时需…

数仓架构模型设计参考

1、数据技术架构 1.1、技术架构 1.2、数据分层 将数据仓库分为三层,自下而上为:数据引入层(ODS,Operation Data Store)、数据公共层(CDM,Common Data Model)和数据应用层&#xff…

Android 数据库之GreenDAO

GreenDAO 是一款开源的面向 Android 的轻便、快捷的 ORM 框架,将 Java 对象映射到 SQLite 数据库中,我们操作数据库的时候,不再需要编写复杂的 SQL语句, 在性能方面,greenDAO 针对 Android 进行了高度优化,…

IPWorks S3 Delphi Edition Crack

IPWorks S3 Delphi Edition Crack IPWorksS3使集成基于云的文件存储变得容易。易于使用的组件可用于与任何S3兼容的存储提供商集成,如Amazon S3、Digital Ocean Spaces、Wasabi、Backblaze B2、IBM Cloud Object storage、Oracle Cloud、Linode等。强大的客户端加密…

springboot+vue智能化网络电子相册图片管理系统_84ds3

随着计算机技术发展,计算机系统的应用已延伸到社会的各个领域,大量基于网络的广泛应用给生活带来了十分的便利。所以把智能化电子相册与现在网络相结合,利用计算机搭建智能化电子相册系统,实现智能化电子相册的信息化。则对于进一…

01_什么是ansible、基本架构、ansible工作机制、Ansible安装、配置主机清单、设置SSH无密码登录等

1.什么是ansible 1.1.基本介绍 1.2.基本架构 1.3.基本特征 1.4.优点 1.5.ansible工作机制 2.Ansible安装 2.1.机器准备 2.2.安装ansible 2.2.1.安装epel源 2.2.2.安装ansible 2.2.3.查看ansible版本 2.2.4.树状结构展示文件夹 2.2.4.1.其中ansible.cfg的内容如下 2.2.4.2.host的…

springboot调用webservice简便方式

此方法不建议在需要高并发或者是批量调用webservice接口时使用,比较吃内存。仅在管理系统后台中,或者是用户量少时可以采用此取巧方案。 直接上核心代码: package com.dhc.minboot.api;import org.slf4j.Logger; import org.slf4j.LoggerFa…

SQL笔记-正态分布函数(二)

在Oracle数据库中,并没有直接提供计算正态分布函数(累积分布函数)的内置函数。不过,你可以使用PL/SQL编程语言来实现一个自定义的正态分布函数。下面是一个简单的示例: CREATE OR REPLACE FUNCTION normdist(x NUMBER…

jmeter 二次开发详解

目录 背景: 自定义 BeanShell 功能 自定义请求编写(Java Sampler) 实现 Java Sampler 功能的两种方式 案例:使用 JavaSampler 重写 HTTP 的 POST 请求 自定义函数助手 背景: JMeter 是一个功能强大的性能测试工具…

The ‘kotlin-android-extensions‘ Gradle plugin is no longer supported.

Android使用kotlin开发,运行报错 The kotlin-android-extensions Gradle plugin is no longer supported. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.an…

linux umask 详解

1. umask 定义 在 linux 系统中,umask 被定义在 /etc/profile 配置文件中,有一段 shell 脚本对 umask 是这么定义的。在 shell 会话输入命令: $ cat /etc/profile # 查看 /etc/profile 配置文件的内容 if [ $UID -gt 199 ] &&…

Codeforces の 动态规划

Codeforces Round 785 (Div. 2) - C. Palindrome Basis dp(9/100) 题目链接 思路:整数划分基础上加一个判断回文的条件 整数划分思路:背包容量为n,物品有体积为1~n n种,每种无数个,求使背包恰好装满的方案数——完全背…

Vue3中v-model在原生元素和自定义组件上的使用

目录 前言 一、原生元素上的用法 1. 输入框(input) 2. 多行文本域(textarea) 3. 单选按钮(radio) 4. 多选框(checkbox) 5. 下拉选择框(select) 二、自定义组件上的用法 1. 定义一个名为 modelValue 的 props 属性和一个名为 update:modelValue 的事件 2.使用一个可…

工具箱:在线免费使用的文档工具:(PDF转换,图片压缩等)

这些都是博主亲自使用过的,可以使用。 PDF转换器: http://www.pdfdo.com/ 图片压缩: 免费在线图片/视频压缩工具 | 图片压缩 | 免费 JPG PNG GIF 图像压缩 (yalijuda.com)

网络编程 tcp udp http编程流程 网络基础知识

讲解 网络基础知识网络编程tcp编程流程图示理解bind和accept函数理解监视套接字和链接套接字理解linux和window下的编程实现tcp特点 udp编程流程图示理解udp特点 http编程流程图示理解编程实现-网站服务器 网络基础知识 OSI分层:应用层 表示层 会话层 传输层 网络层…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息:properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

96 | Python 小项目—— 学生成绩管理系统

文章目录 项目概述功能点2. 登录界面3. 主页面4. 数据录入界面5. 数据删除界面6. 数据修改界面7. 数据查询界面8. 成绩排名界面9. 成绩分析界面10. 学生信息查询界面11. 运行和测试总结项目概述 学生成绩管理系统是一个简单的学生课程管理系统,旨在帮助学校或教育机构轻松管理…