【leetcode】232. 用栈实现队列

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

【leetcode】232. 用栈实现队列,实例,leetcode,算法,linux

1.使用两个栈结构构建队列

我们需要自定义栈及其相关操作

栈结构遵循后入先出的原则,队列结构遵循先入先出的原则

构建具有两个栈结构的队列,栈pushST用于数据的插入,栈popST用于数据的删除

为栈结构动态开辟空间并初始化栈结构

//定义一个具有两个栈的队列结构
typedef struct {
    ST pushST;//插入数据栈
    ST popST;//删除数据栈

} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
		//内存开辟失败
		if(obj == NULL)
		{
			perror("malloc fail");
			exit(-1);
		}
		//开辟成功,初始化
		else
		{
			StackInit(&obj->pushST);
			StackInit(&obj->popST);
		}
			return obj;

}

2.入队操作

模拟入队操作,即将所有元素压栈即可,这里我们将数据压入栈pushST

void myQueuePush(MyQueue* obj, int x) {
		//把数据压入插入数据专用栈
		StackPush(&obj->pushST,x);

}
3.出队操作

模拟队列的出队操作:队列出队访问的是队头数据,即先进入结构的数据,在栈中即为栈底元素,要访问栈底元素,需要后入的元素先出栈才能访问

【leetcode】232. 用栈实现队列,实例,leetcode,算法,linux

以上操作后,栈pushST和栈popST的结构如下:

【leetcode】232. 用栈实现队列,实例,leetcode,算法,linux此时栈pushST的栈顶元素即模拟队列的队头元素,存储并出栈即可

以上操作进行完之后需要将栈popST中的数据还原回pushST吗?

分析:不需要将栈popST中的数据还原回pushST,当进行下一次模拟出队操作时,只需要访问栈popST的栈顶元素即可,栈popST栈顶的元素为先进入栈pushST的元素;若popST为空,则重新进行上述步骤即可

📖Note:

栈结构遵循先进先出的原则,当我们把pushST栈中的元素依次出栈再入栈popST时,元素入栈popST顺序刚好与之前的入栈pushST的先后顺序相反,从而使这些元素出栈popST时栈顶刚好是先入栈pushST的元素

//将pushST中元素外依次倒入popST
void pushSTPopST(MyQueue* obj)
{
		if(StackEmpty(&obj->popST))
		{
			while(!StackEmpty(&obj->pushST))
			{
				StackPush(&obj->popST,StackTop(&obj->pushST));
				StackPop(&obj->pushST);
			}
		}
}

int myQueuePop(MyQueue* obj) {
		pushSTPopST(obj);

		int front = StackTop(&obj->popST);
		StackPop(&obj->popST);
		return front;
}

4.访问队列的开头元素

队列的开头元素即pushST栈中的栈底元素,将栈pushST中的所有元素入到栈popST中,再访问栈popST的栈顶元素即可

int myQueuePeek(MyQueue* obj) {
		pushSTPopST(obj);
    
		return StackTop(&obj->popST);
}

5.判断队列是否为空

队列结构为两个栈结构构成的,当两个栈都为空的时候,队列即为空

bool myQueueEmpty(MyQueue* obj) {

    return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}

6.空间释放

构建的队列结构动态开辟了空间,所有操作结束后,需要释放空间,否则会造成内存泄漏

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->pushST);
    StackDestroy(&obj->popST);
}

参考代码如下:文章来源地址https://www.toymoban.com/news/detail-661020.html

//栈的相关定义
typedef int STDataType;
//动态内存开辟
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化
void StackInit(ST* ps);
//销毁
void StackDestroy(ST* ps);
//插入数据
void StackPush(ST* ps, STDataType x);
//删除数据
void StackPop(ST* ps);
//访问栈顶数据
STDataType StackTop(ST* ps);
//判断是否为空栈
bool StackEmpty(ST* ps);
//访问栈中数据
void StackPopAll(ST* ps);
//计算栈的大小
int StackSize(ST* ps);

//初始化
void StackInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}
//销毁
void StackDestroy(ST* ps)
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->top = ps->capacity = 0;
}
//插入数据
void StackPush(ST* ps, STDataType x)
{
	assert(ps);
	//扩容
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : (ps->capacity) * 2;
		STDataType* tmp = realloc(ps->a, newcapacity * sizeof(STDataType));
		//扩容失败
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		//扩容成功
		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//插入数据
	ps->a[ps->top] = x;
	ps->top++;
}
//删除数据
void StackPop(ST* ps)
{
	assert(ps);
	//栈不为空才能删除
	assert(!StackEmpty(ps));
	--ps->top;
}
//访问栈顶数据
STDataType StackTop(ST* ps)
{
	assert(ps);
	//栈不为空才能访问
	assert(!StackEmpty(ps));
	return ps->a[ps->top - 1];
}
//判断是否为空栈
bool StackEmpty(ST* ps)
{
	assert(ps);
	return ps->top == 0;
}
//计算栈的大小
int StackSize(ST* ps) 
{
	assert(ps);
	return ps->top;
}

//定义一个具有两个栈的队列结构
typedef struct {
    ST pushST;//插入数据栈
    ST popST;//删除数据栈

} MyQueue;


MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
		//内存开辟失败
		if(obj == NULL)
		{
			perror("malloc fail");
			exit(-1);
		}
		//开辟成功,初始化
		else
		{
			StackInit(&obj->pushST);
			StackInit(&obj->popST);
		}
			return obj;

}

void myQueuePush(MyQueue* obj, int x) {
		//把数据压入插入数据专用栈
		StackPush(&obj->pushST,x);

}
//将pushST中元素外依次倒入popST
void pushSTPopST(MyQueue* obj)
{
		if(StackEmpty(&obj->popST))
		{
			while(!StackEmpty(&obj->pushST))
			{
				StackPush(&obj->popST,StackTop(&obj->pushST));
				StackPop(&obj->pushST);
			}
		}
}

int myQueuePop(MyQueue* obj) {
		pushSTPopST(obj);

		int front = StackTop(&obj->popST);
		StackPop(&obj->popST);
		return front;
}

int myQueuePeek(MyQueue* obj) {
		pushSTPopST(obj);
    
		return StackTop(&obj->popST);
}

bool myQueueEmpty(MyQueue* obj) {

    return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->pushST);
    StackDestroy(&obj->popST);
}

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

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

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

相关文章

  • 【创作赢红包】LeetCode:232. 用栈实现队列

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 题目描述 :请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列

    2023年04月12日
    浏览(34)
  • Day10|LeetCode232.用栈实现队列、LeetCode 225. 用队列实现栈

    栈和队列理论基础: 队列是先进先出,栈是先进后出。如图所示: 栈和队列是STL(C++标准库)里面的两个数据结构。 栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。  栈的内部结构,

    2024年02月14日
    浏览(29)
  • 栈和队列OJ题:LeetCode--232.用栈实现队列

    朋友们、伙计们,我们又见面了,今天给大家带来的是LeetCode--232.用栈实现队列 数 据 结 构 专 栏:数据结构 个    人   主    页 :stackY、 LeetCode 专  栏 :LeetCode刷题训练营 LeetCode--232.用栈实现队列:https://leetcode.cn/problems/implement-queue-using-stacks/ 目录 1.题目介绍 2.实例演示

    2024年02月05日
    浏览(37)
  • LeetCode 232.用栈实现队列(详解) (๑•̌.•๑)

    创建两个栈,一个用于入数据,一个用于出数据。分别是pushST和popST; 1.如果是入数据就直接入进pushST 2.如果是出数据,先检查popST中有无数据,如果有数据,就直接出。如果没数据,就将pushST中的数据放进popST中,再从popST中出数据。 当pushST中的数据入到popST时,数据是顺序的

    2024年01月24日
    浏览(32)
  • Leetcode的AC指南 —— 栈与队列:232.用栈实现队列

    摘要: **Leetcode的AC指南 —— 栈与队列:232.用栈实现队列 **。题目介绍:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int

    2024年01月20日
    浏览(32)
  • 算法第10天|232.用栈实现队列225. 用队列实现栈

    力扣链接 题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作( push 、 pop 、 peek 、 empty ): 实现  MyQueue  类: void push(int x)  将元素 x 推到队列的末尾 int pop()  从队列的开头移除并返回元素 int peek()  返回队列开头的元素 boolean empty(

    2024年02月22日
    浏览(33)
  • 力扣232:用栈实现队列【java语言实现】

            根据题目要求:要用栈实现队列中的相关方法,收先要明确栈和队列的相关特性 栈:   先进后出 队列:先进先出 先让数字1,2,3,4分别依次 进入 栈和队列中,观察一下:         接下来 弹出 一个元素:可以看到:队列中弹出的元素是1,栈中弹出的元素

    2024年02月20日
    浏览(27)
  • 第10天-代码随想录刷题训练-第五章 栈和队列- ● 理论基础 ● 232.用栈实现队列 ● 225. 用队列实现栈

    栈和队列对应的三个不同的STL版本,底层实现方式不一样, 为我们所知道的是 SGI STL 栈 栈提供 pop和push等接口, 不提供走访功能 也不提供迭代器, 不像map和set可以使用迭代器遍历,往往不被归类为容器,而是容器适配器 栈的内部实现结构可以使用 verctor、list 和 deque(默认)

    2024年02月04日
    浏览(29)
  • Leetcode每日一题——“用栈实现队列”

    各位CSDN的uu们你们好呀,今天,小雅兰的内容是用栈实现队列,这和小雅兰的上一篇博客“用队列实现栈”好像有点点关系噢,事实上,也确实是这样的,下面,让我们进入Leetcode的世界吧!!! Leetcode每日一题——“用队列实现栈”_认真学习的小雅兰.的博客-CSDN博客    

    2024年02月06日
    浏览(36)
  • 【LeetCode】数据结构题解(12)[用栈实现队列]

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

    2024年02月13日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包