leetcode刷题之用栈实现队列(C语言版)

news2024/9/24 3:25:55

leetcode刷题之用栈实现队列(C语言版)

  • 一、题目描述
  • 二、题目要求
  • 三、题目解析
    • Ⅰ、typedef struct
    • Ⅱ、MyQueue* myQueueCreate
    • Ⅲ、void myQueuePush(MyQueue* obj, int x)
    • Ⅳ、int myQueuePeek(MyQueue* obj)
    • Ⅴ、int myQueuePop(MyQueue* obj)
    • Ⅶ、bool myQueueEmpty(MyQueue* obj)
    • Ⅷ、void myQueueFree(MyQueue* obj)
  • 四、完整代码

一、题目描述

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

实现 MyQueue 类:

①、void push(int x) 将元素 x 推到队列的末尾
②、int pop() 从队列的开头移除并返回元素
③、int peek() 返回队列开头的元素
④、boolean empty() 如果队列为空,返回 true ;否则,返回 false

二、题目要求

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

三、题目解析

看到这道题目,我们首先要了解一些基础的知识,例如栈和队列的一些相关特性,比如栈是先进后出,队列是先进先出。如果有小伙伴还没有掌握这两种数据结构,建议先看一下博主之前有关栈和队列的文章,《数据结构——栈的详细介绍》和《数据结构——看完这篇保证你学会队列》,相信大家看完之后会有一个更深的了解。
首先解决这个问题我们 需要先用C语言完成一个栈的基本实现,其功能接口包括栈的创建,栈的销毁,压栈,出栈等基本操作。代码如下:

typedef int StDatatype;
typedef struct Stack
{
	StDatatype* a;
	int top;
	int capacity;
}ST;


void InitStack(ST* pos);
void DestoryStack(ST* pos);
void PushStack(ST* pos,StDatatype x);
void PopStack(ST* pos);
StDatatype TopStack(ST* pos);
bool STEmpty(ST* pos);
int SizeST(ST* pos);
void InitStack(ST* pos)
{
	//断言
	assert(pos);
	pos->a = NULL;
	pos->top = 0;//指向栈顶元素的下一个
	          //pos->top=-1为指向栈顶元素
	pos->capacity = 0;
}
void DestoryStack(ST* pos)
{
	assert(pos);
	free(pos->a);
	pos->a = NULL;
	pos->capacity = pos->top = 0;
}
void PushStack(ST* pos, StDatatype x)
{
	assert(pos);
	if (pos->top == pos->capacity)
	{
		int newcapacity = pos->capacity == 0 ? 4 : pos->capacity * 2;
		StDatatype* tmp = (StDatatype*)realloc(pos->a, newcapacity * sizeof(StDatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pos->a = tmp;
		pos->capacity = newcapacity;
	}

	//插入数据
	pos->a[pos->top] = x;
	pos->top++;

}
void PopStack(ST* pos)
{
	assert(pos);
	assert(!STEmpty(pos));
	pos->top--;
}
StDatatype TopStack(ST* pos)
{
	assert(pos);
	assert(!STEmpty(pos));
	return pos->a[pos->top - 1];
}
bool STEmpty(ST* pos)
{
	assert(pos);
	return pos->top == 0;
}
int SizeST(ST* pos)
{
	assert(pos);
	return pos->top;
}

接着我们便可以通过我们构建的栈的相关功能,通过我们的分析,用栈来构造一个属于我们自己的队列。
解决本题的基本思路便是:
①、通过上述代码,构建两个栈。一个为进数据的栈,一个为出数据的栈。
②、通过分析,完成题目中的上述接口。
在这里插入图片描述

Ⅰ、typedef struct

通过上述的分析,我们知道,我们需要用两个栈来完成我们的队列构造。所以我们将在结构体内构造两个栈。

typedef struct {
    ST pushst;
    ST popst;
} MyQueue;

Ⅱ、MyQueue* myQueueCreate

这部分的函数主要是我们队列的创建,我们需要在内存中开辟空间,来完成两个栈的初始化。我们直接调用栈里面的接口便可以完成本次的初始化。

MyQueue* myQueueCreate() 
{
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    if(obj==NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    InitStack(&obj->pushst);
    InitStack(&obj->popst);
    return obj;
}

Ⅲ、void myQueuePush(MyQueue* obj, int x)

通过前面的分析,我们可以知道,我们可以直接将需要压栈的数据压入pushst
代码如下:

void myQueuePush(MyQueue* obj, int x)
{
     PushStack(&obj->pushst,x);
}

Ⅳ、int myQueuePeek(MyQueue* obj)

首先我们需要对popst进行判空操作,如果其栈内不为空(有数据的话),我们便可以直接对其进行出栈操作,如果其中没有数据,我们便需要对其进行到数据,将Pushst内的数据,导入popst内。代码如下:

int myQueuePeek(MyQueue* obj)
{
  if(STEmpty(&obj->popst))
    {
        while(!STEmpty(&obj->pushst))
        {
            PushStack(&obj->popst,TopStack(&obj->pushst));
            PopStack(&obj->pushst);
        }
    }  
    return TopStack(&obj->popst);  
} 

Ⅴ、int myQueuePop(MyQueue* obj)

我们直接对myQueuePeek函数进行复用,然后对popst进行出栈操作,最后直接返回即可。

int myQueuePop(MyQueue* obj) {
    int front=myQueuePeek(obj);
    PopStack(&obj->popst);
    return front;
    
}

Ⅶ、bool myQueueEmpty(MyQueue* obj)

判空操作,需要满足popstpushst都为空,才能保证队列为空。

bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->popst)&&STEmpty(&obj->pushst);
    
}

Ⅷ、void myQueueFree(MyQueue* obj)

在freeobj之前,我们需要对两个栈进行销毁操作,以防止内存的泄漏。

void myQueueFree(MyQueue* obj) {
    DestoryStack(&obj->popst);
    DestoryStack(&obj->pushst);
    free(obj);    
}

四、完整代码




typedef int StDatatype;
typedef struct Stack
{
	StDatatype* a;
	int top;
	int capacity;
}ST;


void InitStack(ST* pos);
void DestoryStack(ST* pos);
void PushStack(ST* pos,StDatatype x);
void PopStack(ST* pos);
StDatatype TopStack(ST* pos);
bool STEmpty(ST* pos);
int SizeST(ST* pos);
void InitStack(ST* pos)
{
	//断言
	assert(pos);
	pos->a = NULL;
	pos->top = 0;//指向栈顶元素的下一个
	          //pos->top=-1为指向栈顶元素
	pos->capacity = 0;
}
void DestoryStack(ST* pos)
{
	assert(pos);
	free(pos->a);
	pos->a = NULL;
	pos->capacity = pos->top = 0;
}
void PushStack(ST* pos, StDatatype x)
{
	assert(pos);
	if (pos->top == pos->capacity)
	{
		int newcapacity = pos->capacity == 0 ? 4 : pos->capacity * 2;
		StDatatype* tmp = (StDatatype*)realloc(pos->a, newcapacity * sizeof(StDatatype));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pos->a = tmp;
		pos->capacity = newcapacity;
	}

	//插入数据
	pos->a[pos->top] = x;
	pos->top++;

}
void PopStack(ST* pos)
{
	assert(pos);
	assert(!STEmpty(pos));
	pos->top--;
}
StDatatype TopStack(ST* pos)
{
	assert(pos);
	assert(!STEmpty(pos));
	return pos->a[pos->top - 1];
}
bool STEmpty(ST* pos)
{
	assert(pos);
	return pos->top == 0;
}
int SizeST(ST* pos)
{
	assert(pos);
	return pos->top;
}


typedef struct {
    ST pushst;
    ST popst;
} MyQueue;


MyQueue* myQueueCreate() 
{
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
    if(obj==NULL)
    {
        perror("malloc fail");
        return NULL;
    }
    InitStack(&obj->pushst);
    InitStack(&obj->popst);
    return obj;
    
}

void myQueuePush(MyQueue* obj, int x) 
{
    PushStack(&obj->pushst,x);
}
int myQueuePeek(MyQueue* obj)
{
  if(STEmpty(&obj->popst))
    {
        while(!STEmpty(&obj->pushst))
        {
            PushStack(&obj->popst,TopStack(&obj->pushst));
            PopStack(&obj->pushst);
        }
    }  
    return TopStack(&obj->popst);  
}
int myQueuePop(MyQueue* obj) {
    int front=myQueuePeek(obj);
    PopStack(&obj->popst);
    return front;
    
}



bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->pushst)&&STEmpty(&obj->popst);
}

void myQueueFree(MyQueue* obj) {
    DestoryStack(&obj->popst);
    DestoryStack(&obj->pushst);
    free(obj);
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

在这里插入图片描述

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

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

相关文章

Charles 网络抓包工具详解与实战指南

文章目录 导读软件版本Charles基本原理核心功能下载及安装界面介绍网络包展示 常用场景介绍PC 端网络抓包移动端网络抓包PC 端配置手机端配置 开启 SSL 代理PC 端和移动端 CA 证书安装Charles 直接安装Charles 下载 CA 文件手动安装 常用操作请求重发请求改写、动态改写断点&am…

C# Winform使用log4net记录日志

写在前面 Log4Net是从Java的log4j移植过来的,功能也与log4j类似,可以把日志信息输出到文件、数据库、控制台、Windows 事件日志、远程系统日志服务等不同的介质或目标。 Log4Net配置选项丰富灵活,并且可在运行时动态更新配置并应用&#xf…

Sui第七轮资助:八个项目共获得超过50万美元的资助

今日,Sui基金会宣布了本月获得资助的项目方,他们将获得超过50万美元的资助金,用于构建项目,推动Sui的采用和发展。要获得资助,项目必须提交提案,详细说明他们正在构建的内容、预算明细、关键里程碑、团队经…

Walrus 入门教程:如何创建模板以沉淀可复用的团队最佳实践

模板是 Walrus 的核心功能之一,模板创建完成后用户可以重复使用,并在使用过程中逐渐沉淀研发和运维团队的最佳实践,进一步简化服务及资源的部署。用户可以使用 HCL 语言自定义创建模板,也可以一键复用 Terraform 社区中上万个成熟…

好工具|datamap,一个好用的地图可视化Excel插件,在Excel中实现地理编码、拾取坐标

在做VRP相关研究的时候,需要对地图数据做很多处理,比如地理编码,根据“重庆市沙坪坝区沙正街174号”这样的一个文本地址知道他的经纬度;再比如绘制一些散点图,根据某个位置的经纬度在地图上把它标注出来。还有有的时候…

教育数字化转型:塑造未来学习新范式

在国家教育数字化战略行动指引下,我国正积极推动数字化赋能教育高质量发展,以塑造教育发展的新优势。如今,随着科技新基建的普及和数字化赋能教育的深入推进,未来的教育模型正在逐渐形成。 在新的教育模型中,数字化学…

C语言众数问题(ZZULIOJ1201:众数问题)

题目描述 给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。 例如,S{1,2,2,2,3,5}。多重集S的众数是2,其重数为3。 编程任务…

UNETR:用于三维医学图像分割的Transformer

论文链接:https://arxiv.org/abs/2103.10504 代码链接: https://monai.io/research/unetr 机构:Vanderbilt University, NVIDIA 最近琢磨不出来怎么把3d体数据和文本在cnn中融合,因为确实存在在2d里面用的transformer用在3d里面…

【CCF-PTA】第03届Scratch第05题 -- 统计出现次数最多的字

统计出现次数最多的字 【题目描述】 我国自古流传下来不少脍炙人口的诗歌,各具特色,别具一格。有些诗只用寥寥几个字,就能描绘出生动的意境。 请找出以下诗篇中出现次数最多的字,如果有多个字出现次数相同,则答案为…

【精选】​​通道热点加持的LW-ResNet:小麦病害智能诊断与防治系统

1.研究背景与意义 小麦是世界上最重要的粮食作物之一,但由于病害的侵袭,小麦产量和质量受到了严重的威胁。因此,开发一种高效准确的小麦病害识别分类防治系统对于保障粮食安全和农业可持续发展具有重要意义。 传统的小麦病害识别分类方法主…

STM32 MAP文件

文章目录 1 生成Map2 map中概念3 文件分析流程3.1 Section Cross References3.2 Removing Unused input sections from the image(移除未使用的段)3.3 Memory Map of the image(映像的内存分布)3.3.1 加载域3.3.2 运行域 4 代码运…

Using PeopleCode in Application Engine Programs在应用引擎程序中使用PeopleCode

This section provides an overview of PeopleCode and Application Engine programs and discusses how to: 本节概述了PeopleCode和应用程序引擎程序,并讨论了如何: Decide when to use PeopleCode.决定何时使用PeopleCode。Consider the program environment.考…

【从零开始实现意图识别】中文对话意图识别详解

前言 意图识别(Intent Recognition)是自然语言处理(NLP)中的一个重要任务,它旨在确定用户输入的语句中所表达的意图或目的。简单来说,意图识别就是对用户的话语进行语义理解,以便更好地回答用户…

2020年12月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于广播消息,以下说法正确的是? A:只有角色,可以通过“广播消息”积木,向其他角色或是背景发送消息 B:只有背景,可以通过“广播消息”积木,向其他角色或是背景发送消息 C:背…

远端WWW服务支持TRACE请求

安全扫描的时候,扫出来的问题,这里不分享如何处理,就只分享下,如何找到有问题的端口。 通过命令 curl -v -X TRACE -I ip:port,这里的ip和端口就是扫描出有问题的服务器地址ip以及开放的服务端口。 观察返回值&#x…

建设数字工厂管理系统对企业来说有哪些优势

随着科技的飞速发展,数字化转型已成为企业持续发展的必由之路。在这一背景下,建设数字工厂管理系统显得尤为重要。本文将详细分析数字工厂管理系统给企业带来的优势,以及企业如何选择合适的管理系统和成功实施数字化转型。 一、数字工厂管理系…

【华为数通HCIP | 网络工程师】821-IGP高频题、易错题之OSPF(1)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

【AIGC重塑教育】AI大爆发的时代,未来的年轻人怎样获得机会和竞争力?

目录 AI浪潮来袭 AI与教育 AI的优势 延伸阅读 推荐语 ​作者:刘文勇 来源:IT阅读排行榜 本文摘编自《AIGC重塑教育:AI大模型驱动的教育变革与实践》,机械工业出版社出版 AI浪潮来袭 这次,狼真的来了。 AI正迅猛地…

【c语言】重温一下动态内存,int数组过大会造成栈错误

项目场景: 项目场景:互助群同学在刷题的过程中,遇到的一个题目,需要申请一个很大数组,于是这个同学就写了int[1000000],其实这样写也没有错,可是运行后却显示栈错误。于是就找到我来请教,我想就…

mapTR环境配置和代码复现

MAPTR: STRUCTURED MODELING AND LEARNING FOR ONLINE VECTORIZED HD MAP CONSTRUCTION 论文 :https://arxiv.org/pdf/2208.14437.pdf 代码:https://github.com/hustvl/MapTR MapTR,是一个结构化的端到端框架,用于高效的在线矢量化高精地图构建。我们提出了一种基于统一…