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

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

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

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

😉 1.题目来源

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

👀2.题目描述

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
1.void push(int x) 将元素 x 推到队列的末尾
2.int pop() 从队列的开头移除并返回元素
3.int peek() 返回队列开头的元素
4.boolean empty() 如果队列为空,返回 true ;否则,返回 false

🤨说明:

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

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

🤔3.解题思路

  • 从题目要求我们知道,要用两个栈列实现队列的功能,也就是使用的是栈,😎但是实现的效果时队列的效果。
  • 开始做题之前我们首要的是明白队列和栈的特点。这里我们就简单的提一下,具体的知识请看上述给的链接。💯队列——队列的特性是👍先进的先出,就跟食堂打饭一样,先到的先打饭,打完饭就可以走了。栈——栈的特性是👍先进的后出,就跟我们在桌子上叠书一样,想要拿到最底下的书就要先把最上面的书先拿走。
  • 首先队列的插入和栈的插入都是一样的,都是尾插,所以push这个动作并不难,关键是栈的删除是尾删,而队列的删除时头删,那怎么样才能使用两个栈实现删除头上的数据呢。既然栈是尾删,能不能把存放进去的数据反过来,这样虽然栈进行的是尾删,但是删除的是头上的数据,也就相当于是头删一样了。
  • 👉那么我们的思路肯定是这样的:两个栈,首先第一次存放数据的时候,😎随便找一个栈粗放数据,假设放的是1,2,3,4,5头数据是1,尾数据是5,等到要删除的时候通过找到尾的方式把数据一一放到另一个栈中,这样另一个栈的数据就是5,4,3,2,1了,这个时候头数据就是5,尾数据就是1了,Pop的时候就是Pop尾数据1,也就是插入时的头数据,这样就实现头删😉。而如果还要继续存放数据的时候就把数据按照上面同样的操作把数据重新放回去,也就是2,3,4,5,然后继续在后面放数据,要删除的时候再重复第一次的操作即可。那么问题来了,从上述分析我们知道了两个栈,一个栈是用来存放数据进去的栈我们命名为Spush,一个是用来删除数据的栈Spop,而且我们每次还要继续放数据的是由都要把数据从Spop中把数据放回Spush,然后进行追加数据🤦‍,但是这一步真的有必要吗?🤔其实并不需要这两个栈就只需要完成一个push另一个pop就行了,追加数据的时候也不需要把数据从Spop中重新放回Spush中,只需要等Spop中数据被删除完后,再从Spush中导入即可。

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

  • 所以总上所述,我们的两个栈,每一栈复杂特定的功能,一个负责push数据,一个用来pop数据

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


typedef struct {

} MyQueue;

MyQueue* myQueueCreate() {

}

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

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

🥳4.代码展示

//栈函数接口
typedef int STDataType;
typedef struct Stack
{
	STDataType* data;
	int capaciyt;
	int size;
}Stack;

void StackInit(Stack* ps);

void StackDestroy(Stack* ps);

void StackPush(Stack* ps, STDataType x);

void StackPop(Stack* ps);

STDataType StackTop(Stack* ps);

bool StackEmpt(Stack* ps);

int StackSize(Stack* ps);

void StackInit(Stack* ps)
{
	assert(ps);
	ps->data = NULL;
	ps->capaciyt = 0;
	ps->size = 0;
}

void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->data);
	ps->data = NULL;
	ps->capaciyt = ps->size = 0;
}

void StackPush(Stack* ps, STDataType x)
{
	assert(ps);

	if (ps->size == ps->capaciyt)
	{
		int newCapacity = ps->capaciyt == 0 ? 4 : ps->capaciyt * 2;
		STDataType* tmp = (STDataType*)realloc(ps->data, sizeof(STDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc");
			exit(-1);
		}
		ps->data = tmp;
		ps->capaciyt = newCapacity;
	}

	ps->data[ps->size] = x;
	ps->size++;
}

void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	ps->size--;
}

STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpt(ps));

	return ps->data[ps->size - 1];
}

bool StackEmpt(Stack* ps)
{
	assert(ps);

	return ps->size == 0;
}

int StackSize(Stack* ps)
{
	assert(ps);

	return ps->size;
}

//函数实现
typedef struct {
    Stack Spush;
    Stack Spop;
} MyQueue;

MyQueue* myQueueCreate() {
    MyQueue* ret = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&ret->Spush);
    StackInit(&ret->Spop);

    return ret;
}

//这里我把Peek函数放到了前面,考虑到后面的Pop也会用到类似的功能,直接服用Peek就行了
int myQueuePeek(MyQueue* obj) {
    //为空导入数据
    if (StackEmpt(&obj->Spop))
    {
        while (!StackEmpt(&obj->Spush))
        {
            StackPush(&obj->Spop,StackTop(&obj->Spush));
            StackPop(&obj->Spush);
        }
    }
    return StackTop(&obj->Spop);
}

void myQueuePush(MyQueue* obj, int x) {
    //直接再Spush中插入数据
    StackPush(&obj->Spush,x);
}

int myQueuePop(MyQueue* obj) {
    //服用Peek,如果Spop为空,就从Spush中导入数据
   int ret = myQueuePeek(obj);
   StackPop(&obj->Spop);
   return ret;
}

bool myQueueEmpty(MyQueue* obj) {
    //两个为空才为空
    return StackEmpt(&obj->Spop) && StackEmpt(&obj->Spush);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->Spop);
    StackDestroy(&obj->Spush);

    free(obj);
}

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

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

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

相关文章

  • 【数据结构】用栈实现括号匹配

    【数据结构】用栈实现括号匹配

    1.创立一个判断括号是否匹配的函数BracketsCheck 2.传参(栈,输入的字符串) 3.对字符串中的(、[、{、这三种括号进行匹配 4.顺序从左往右进行,依次将符合条件的括号放入栈中,满足FILO原则 5.但拿到右括号时进行匹配,如果匹配成功,那么就出栈,如果失败就返回false 定义

    2024年02月06日
    浏览(11)
  • 【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)
  • C语言数据结构篇——用栈实现四则运算

    C语言数据结构篇——用栈实现四则运算

    作者名:Demo不是emo  主页面链接: 主页传送门 创作初心: 舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: 网络安全,数据结构 每日emo: 我爱

    2024年02月09日
    浏览(31)
  • 【数据结构与算法】7、队列(Queue)的实现【用栈实现队列】

    【数据结构与算法】7、队列(Queue)的实现【用栈实现队列】

    ☘️ 队列 (Queue)是一种特殊的 线性表 , 只能在头尾两端进行操作 🎁 队尾(rear):只能从 队尾添加 元素,一般叫做 enQueue , 入队 🎁 队头(front):只能从 队头移除 元素,一般叫做 deQueue , 出队 🎁 先进先出 的原则, F irst I n F irst O ut, FIFO ☘️ 队列内部的实现可

    2024年02月12日
    浏览(10)
  • 【数据结构与算法】用队列实现栈&&用栈实现队列&&设计循环队列

    【数据结构与算法】用队列实现栈&&用栈实现队列&&设计循环队列

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、

    2024年01月20日
    浏览(12)
  • 《数据结构初阶》用队列实现栈&&用栈实现队列的细致解析

    《数据结构初阶》用队列实现栈&&用栈实现队列的细致解析

    目录 一、⏱️本章重点 二、⏱️队列实现栈 三、⏱️栈实现队列 四、⏱️解题思路总结 用两个队列实现栈 用两个栈实现队列 解题思路总结  我们有两个队列:  入栈数据1、 2、 3 可以将数据入队列至队列一或者队列二。 如何出栈?  但出栈要先出1,怎么办? 第一步 :

    2023年04月25日
    浏览(10)
  • 数据结构刷题训练:用栈实现队列(力扣OJ)

    数据结构刷题训练:用栈实现队列(力扣OJ)

    目录 前言 1. 题目:用栈实现队列 2. 思路 3. 分析  3.1 定义 “ 队列 ”  3.2 创建队列 3.3 入队  3.4 队头数据  3.5 出队  3.6 判空和销毁 4.题解 总结         栈和队列是数据结构中的两个重要概念,它们在算法和程序设计中都有着广泛的应用。本文将带你深入了解如何使用

    2024年02月13日
    浏览(12)
  • 【数据结构-进制转换】用栈实现10进制数转任意进制数

    【数据结构-进制转换】用栈实现10进制数转任意进制数

    用栈实现10进制数转任意进制数代码实现 主要思想 :一个十进制数转成相应进制,是通过自身除于对应进制得余数,直到商为0.将所有余数逆序(即最先得到的余数放最后面)排列,得到的结果为所得相应进制数。这一特性与栈极其类似,栈也是 先进后出 原则,故用栈更为

    2023年04月08日
    浏览(14)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包