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

这篇具有很好参考价值的文章主要介绍了【LeetCode】数据结构题解(11)[用队列实现栈]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【LeetCode】数据结构题解(11)[用队列实现栈],# 玩转数据结构题型,leetcode,数据结构,算法

所属专栏:玩转数据结构题型❤️
🚀 >博主首页:初阳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(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

【LeetCode】数据结构题解(11)[用队列实现栈],# 玩转数据结构题型,leetcode,数据结构,算法

🤔3.解题思路

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

【LeetCode】数据结构题解(11)[用队列实现栈],# 玩转数据结构题型,leetcode,数据结构,算法

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

typedef struct {

} MyStack;

MyStack* myStackCreate() {

}

这个是我们题目出现的函数接口,我来解释一下表示什么意思。文章来源地址https://www.toymoban.com/news/detail-635793.html

  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);
}

到了这里,关于【LeetCode】数据结构题解(11)[用队列实现栈]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【数据结构】如何用栈实现队列?图文解析(LeetCode)

    【数据结构】如何用栈实现队列?图文解析(LeetCode)

    LeetCode链接:232. 用栈实现队列 - 力扣(LeetCode) 注:本文默认读者已掌握栈与队列的基本操作 可以看这篇文章熟悉知识点:【数据结构】栈与队列_字节连结的博客-CSDN博客 目录 做题思路 代码实现 1. MyQueue 2. myQueueCreate 3. myQueuePush 4. myQueuePeek 5. myQueuePop 6. myQueueEmpty 7. myQueueF

    2024年02月11日
    浏览(6)
  • 【LeetCode】数据结构题解(6)[回文链表]

    【LeetCode】数据结构题解(6)[回文链表]

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

    2024年02月03日
    浏览(12)
  • 【LeetCode】数据结构题解(5)[分割链表]

    【LeetCode】数据结构题解(5)[分割链表]

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

    2024年02月04日
    浏览(10)
  • 【LeetCode】数据结构题解(13)[设计循环链表]

    【LeetCode】数据结构题解(13)[设计循环链表]

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

    2024年02月13日
    浏览(8)
  • 【LeetCode】数据结构题解(9)[复制带随机指针的链表]

    【LeetCode】数据结构题解(9)[复制带随机指针的链表]

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

    2024年02月11日
    浏览(42)
  • 【数据结构】如何设计循环队列?图文解析(LeetCode)

    【数据结构】如何设计循环队列?图文解析(LeetCode)

    LeetCode链接:622. 设计循环队列 - 力扣(LeetCode) 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元素 9. 销毁队列 全部代码 设计循环队列,使用数组或链表

    2024年02月10日
    浏览(10)
  • 【LeetCode】【数据结构】栈与队列必刷OJ题

    【LeetCode】【数据结构】栈与队列必刷OJ题

    👀 樊梓慕: 个人主页   🎥 个人专栏: 《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言: 【LeetCode】20.有效的括号(栈的括号匹配问题) 【LeetCode】225.用队列实现栈 【LeetCode】232.用栈实现队列 【LeetCo

    2024年02月13日
    浏览(9)
  • 数据结构与算法之队列: Leetcode 621. 任务调度器 (Typescript版)

    任务调度器 https://leetcode.cn/problems/task-scheduler/ 描述 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或

    2024年02月02日
    浏览(8)
  • 数据结构/队列实现栈

    数据结构/队列实现栈

    在学习数据结构的过程当中,我们会学到栈和队列,在本篇文章中,重点讲解的是队列实现栈,在上篇文章中已经简单介绍过栈和队列的使用说明,以及栈实现队列。(2条消息) 数据结构/栈实现队列_Y君的进化史的博客-CSDN博客 关于一个队列的简单使用方式:    关于一个栈的

    2024年02月02日
    浏览(6)
  • 【数据结构—队列的实现】

    【数据结构—队列的实现】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、队列 1.1队列的概念及结构 二、队列的实现 2.1头文件的实现—Queue.h 2.2源文件的实现—Queue.c 2.3源文件的测试—test.c 三、测试队列实际数据的展示 3.1正常队列的出入 3.2入队列的同时存

    2024年02月04日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包