Leetcode232.用栈实现队列

news2025/2/1 4:59:23

本专栏内容为:leetcode刷题专栏,记录了leetcode热门题目以及重难点题目的详细记录

💓博主csdn个人主页:小小unicorn
⏩专栏分类:Leetcode
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

用栈实现队列

  • 题目描述
  • 解题思路:
  • 代码解决:
  • 结果与总结:

题目描述

题目来源:Leetcode232.用栈实现队列

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):

实现 MyQueue 类:

1.void push(int x) 将元素 x 推到队列的末尾
2.int pop() 从队列的开头移除并返回元素
3.int peek() 返回队列开头的元素
4.boolean empty() 如果队列为空,返回 true ;否则,返回 false

解题思路:

使用两个栈,第一个栈只用于数据的输入,第二个栈只用于数据的输出。当需要输出数据,但第二个栈为空时,先将第一个栈中的数据一个一个导入到第二个栈,然后第二个栈再输出数据即可。
在这里插入图片描述
这样就能够模拟实现一个队列了,即先输入的数据先输出。

代码解决:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>

typedef char STDataType;//栈中存储的元素类型

typedef struct Stack
{
	STDataType* a;//栈
	int top;//栈顶
	int capacity;//容量,方便增容
}Stack;

//初始化栈
void StackInit(Stack* pst)
{
	assert(pst);

	pst->a = (STDataType*)malloc(sizeof(STDataType) * 4);//初始化栈可存储4个元素
	pst->top = 0;//初始时栈中无元素,栈顶为0
	pst->capacity = 4;//容量为4
}

//销毁栈
void StackDestroy(Stack* pst)
{
	assert(pst);

	free(pst->a);//释放栈
	pst->a = NULL;//及时置空
	pst->top = 0;//栈顶置0
	pst->capacity = 0;//容量置0
}

//入栈
void StackPush(Stack* pst, STDataType x)
{
	assert(pst);

	if (pst->top == pst->capacity)//栈已满,需扩容
	{
		STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * pst->capacity * 2);
		if (tmp == NULL)
		{
			printf("realloc fail\n");
			exit(-1);
		}
		pst->a = tmp;
		pst->capacity *= 2;//栈容量扩大为原来的两倍
	}
	pst->a[pst->top] = x;//栈顶位置存放元素x
	pst->top++;//栈顶上移
}

//检测栈是否为空
bool StackEmpty(Stack* pst)
{
	assert(pst);

	return pst->top == 0;
}

//出栈
void StackPop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));//检测栈是否为空

	pst->top--;//栈顶下移
}

//获取栈顶元素
STDataType StackTop(Stack* pst)
{
	assert(pst);
	assert(!StackEmpty(pst));//检测栈是否为空

	return pst->a[pst->top - 1];//返回栈顶元素
}

//获取栈中有效元素个数
int StackSize(Stack* pst)
{
	assert(pst);

	return pst->top;//top的值便是栈中有效元素的个数
}
/*---以上代码是栈的基本功能实现,以下代码是题解主体部分---*/

typedef struct
{
	Stack PushST;//插入数据时用的栈
	Stack PopST;//删除数据时用的栈
}MyQueue;

/** Initialize your data structure here. */
MyQueue* myQueueCreate()
{
	//申请一个队列类型
	MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
	StackInit(&obj->PopST);//初始化PopST
	StackInit(&obj->PushST);//初始化PushST

	return obj;
}

/** Push element x to the back of queue. */
void myQueuePush(MyQueue* obj, int x)
{
	//插入数据,向PushST插入
	StackPush(&obj->PushST,x);
}

/** Get the front element. */
int myQueuePeek(MyQueue* obj)
{
	popST为空时,需先将pushST中数据导入popST
	if (StackEmpty(&obj->PopST))
	{
		将pushST数据全部导入popST
		while (!StackEmpty(&obj->PushST))
		{
			StackPush(&obj->PopST, StackTop(&obj->PushST));
			StackPop(&obj->PushST);
		}
	}
	//返回PopST栈顶的数据
	return StackTop(&obj->PopST);
}


/** Removes the element from in front of queue and returns that element. */
int myQueuePop(MyQueue* obj)
{
	int top = myQueuePeek(obj);
     //删除数据,删除PopST栈顶的元素	
	StackPop(&obj->PopST);
	return top;
}


/** Returns whether the queue is empty. */
bool myQueueEmpty(MyQueue* obj)
{
	//两个栈均为空,则队列为空
	return StackEmpty(&obj->PopST) && StackEmpty(&obj->PushST);
}

void myQueueFree(MyQueue* obj)
{
	//先释放掉两个栈
	StackDestroy(&obj->PopST);
	StackDestroy(&obj->PushST);
	//在释放掉队列的结构体类型
	free(obj);
}


结果与总结:

在这里插入图片描述

通过所有示例,问题得到解决。

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

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

相关文章

Godot2D角色导航-自动寻路教程(Godot设置导航代理的目标位置)

文章目录 创建导航NavigationAgent2D节点设置目标位置其他文章 创建导航 首先&#xff0c;创建一个基本的场景&#xff0c;下面的文章讲解了如何创建一个基本的导航场景&#xff0c;点击如下链接前往该文章&#xff1a; Godot2D角色导航-自动寻路教程 NavigationAgent2D节点 …

淘宝店铺所有商品数据接口,淘宝整店所有商品数据接口,淘宝店铺商品接口,淘宝API接口

淘宝店铺所有商品数据接口可以通过淘宝开放平台获取。以下是具体步骤&#xff1a; 在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的 App Key 和 App Secret 等信息。使用获取到的 App Key 和 App Secret 进行签名和认证&#xff0c;获取 Access Token。调用开…

【java学习—七】方法的重写(31)

文章目录 1. 相关概念2. 代码中理解4. 子类访问父类的修饰符权限说明 1. 相关概念 定义&#xff1a; 在子类中可以根据需要对从父类中继承来的方法进行改造&#xff0c;也称方法的重置、覆盖。在程序执行时&#xff0c;子类的方法将覆盖父类的方法。要求&#xff1a; &#xf…

机器学习笔记 - 车道检测的几种深度学习方法

一、简述 人们在打造自动驾驶汽车时首先想到的就是实现车道检测。这是 Tesla 和 mobileye 所说的“强制性”任务,也是 Sebastian Thrun(自动驾驶汽车教父)在接受采访时所说的首要任务。 这个方向有很多传统的 OpenCV 算法,这些算法由不再使用的非常旧的函数组成。目前全部都…

protobuf 插件(option)使用

protobuf的option使用 一、需求 来源于工作中的一个需求&#xff1a;在传递message时需要对message中不同的字段进行不同的处理&#xff0c;而处理方式通过注释标注在了每个字段的定义后。 类似于有下面这样一个消息&#xff1a; 其中字段1是始终需要的&#xff0c;字段2和3…

计算机网络:静态路由的应用场景及配置

章节&#xff1a;静态路由&#xff08;部分内容参考&#xff1a;《华为HCIA-Datacom认证学习指南》&#xff09; 《华为 HCIA-Datacom认证学习指南》 目录 一、静态路由应用场景 二、静态路由配置 2.1 实验目的 2.2 实验拓扑 2.3 实验步骤 1.配置网络连通性 2.测试网络…

双节前把我的网站重构了一遍

赶在中秋国庆假期前&#xff0c;终于将我的网站&#xff08;https://spacexcode.com/[1]&#xff09;结构定好了&#xff0c;如之前所说&#xff0c;这个网站的定位就是作为自己的前端知识沉淀。内容大致从&#xff1a;前端涉及的基础知识分类汇总&#xff08;知识库&#xff0…

kafka 相关概念

1 kafka 生产者 kafka 用push的方式把消息推送到topic 每个topic下可以有多个分区&#xff0c; 可以用hash 也可以用轮询的方式指定分区 每个分区内部是可以保证顺序的&#xff0c;但是整体无法保证顺序&#xff0c;除非设置成一个topic只有一个分区。 kafka这种多分区的设置 带…

Elasticsearch 8.11 中的合并更少,摄取更快

作者&#xff1a;ADRIEN GRAND Elasticsearch 8.11 改进了管理索引缓存的方式&#xff0c;从而减少了段合并。 我们对 Elasticsearch 8.11 从索引缓存回收内存的方式进行了重大更改&#xff0c;这有助于减少合并开销&#xff0c;从而加快索引速度。 使用我们的日志跟踪&#x…

嵌入式学习笔记(56)LCD的接口技术

12.2.1从电平角度讲本质上都是TTL信号 (1)什么是TTL接口。5V表示逻辑1&#xff0c;0V表示逻辑0。这种就叫TTL电平&#xff0c;和CMOS电平相对比。 (2)SoC的LCD控制器硬件接口是TTL电平的&#xff0c;LCD这边硬件接口也是TTL电平的。所以他们俩本来是可以直接对接的&#xff0…

我测试用的mark down教程

Markdown 教程 欢迎使用 Markdown 你好,Markdown是一种类似 Word 的排版工具,你需要仔细阅读这篇文章,了解一下 Markdown 基础知识。 Markdown 功能和列表演示 Markdown 有以下功能,帮助你用它写博客: 数学公式代码高亮导航功能等等Markdown 的优点: 间接高效大厂支持…

供应链 | MSOM论文解读:零售商响应定价能力对供应链韧性的影响

​ 论文解读&#xff1a;温梓曦&#xff0c;肖善&#xff0c;杨子豪&#xff0c;张怡雯 A Responsive-Pricing Retailer Sourcing from Competing Suppliers Facing Disruptions 原文作者信息&#xff1a; Xi Shan, Tao Li, Suresh P. Sethi (2021) A Responsive-Pricing Ret…

邮箱发送验证码(nodemailer)

邮箱发送验证码&#xff08;nodemailer&#xff09; 前言&#xff1a;后端实现1、前期准备2、安装nodemailer3、代码实现4、效果图 前言&#xff1a; 想要实现向邮箱发送验证码功能&#xff0c;先来简单地梳理一下思路&#xff1a; 前端用正则表达式简单验证下邮箱格式的正确性…

springboot+vue+java付费自习室选座系统nl1u1

本系统从用户的角度出发&#xff0c;结合当前的环境而开发的&#xff0c;在开发语言上是使用的Java语言&#xff0c;在框架上我们是使用的springboot框架&#xff0c;数据库方面使用的是MySQL数据库&#xff0c;开发工具为IDEA。 付费自习室管理系统根据实际情况分为前后台两部…

ROS键盘遥控机器人,通过参数服务器指定速度

1、引言 在上节的驱动机器人&#xff0c;我们知道是cmd_vel话题发布一串Twist类型消息来控制&#xff0c;我们可以输入如下命令查看这个Twist的详细信息&#xff1a;rosmsg show geometry_msgs/Twist geometry_msgs/Vector3 linear float64 x float64 y float64 z geome…

Linux 编写一个 简单进度条

进度条 回车换行理解&#xff1a; 我们要理解&#xff0c;回车换行是两个概念&#xff1a; 换行是把光标移到下一行&#xff0c;是竖直的往下平移&#xff1b;" \n "回车是把光标移到当前行的最开始&#xff1b; " \r " 就和一起打字…

[计算机提升] Windows系统权限

1.2 Windows系统权限 在Windows操作系统中&#xff0c;权限是指授予用户或用户组对系统资源进行操作的权利。权限控制是操作系统中重要的安全机制&#xff0c;通过权限控制可以限制用户对系统资源的访问和操作&#xff0c;从而保护系统安全。 Windows操作系统中包含以下几种权…

FPGA设计时序约束五、设置时钟不分析路径

一、背景 在进行时序分析时&#xff0c;工具默认对所有的时序路径进行分析&#xff0c;在实际的设计中&#xff0c;存在一些路径不属于逻辑功能的&#xff0c;或者不需要进行时序分析的路径&#xff0c;使用set_false_path对该路径进行约束&#xff0c;时序分析时工具将会直接忽…

通过onnxruntime进行模型部署过程中的问题

1.onnxruntime包 从https://github.com/microsoft/onnxruntime/releases/下载解压到D:/code/package/onnruntime 2opencv_c下载https://github.com/opencv/opencv/releases/tag/4.8.1 3.测试opencv代码&#xff1a;总结&#xff1a;添加include目录&#xff0c;添加lib库目录…

网工配置命令总结(1)---Web访问及vlan配置

目录 1.Telnet远程登录设备 2.用户通过Web网管登录设备 3.端口隔离功能的实现 4.配置vlan聚合 5.部分vlan间互通&#xff0c;部分vlan间隔离&#xff0c;vlan内用户隔离 6.限制内网网段互访 1.Telnet远程登录设备 1.使能服务器功能 <HUAWEI> system-view [HUAWEI] …