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

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.mzph.cn/news/164088.shtml

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

相关文章

邦芒忠告:求职者面试时绝不能说的8件事

求职者在面试时应该注意言行举止,避免提及一些敏感或不合适的话题,以下是一些绝不能说的事情: 1、攻击性言辞:不要使用攻击性言辞,如贬低、批评或攻击公司、同事或竞争对手等,这会给人留下不成熟、不尊重他…

新手必看!!附源码!!STM32通用定时器-比较输出PWM

一、什么是PWM? PWM(脉冲宽度调制)是一种用于控制电子设备的技术。它通过调整信号的脉冲宽度来控制电压的平均值。PWM常用于调节电机速度、控制LED亮度、产生模拟信号等应用。 二、PWM的原理 PWM的基本原理是通过以一定频率产生的脉冲信号&#xff0…

SPSS多元对应分析

前言: 本专栏参考教材为《SPSS22.0从入门到精通》,由于软件版本原因,部分内容有所改变,为适应软件版本的变化,特此创作此专栏便于大家学习。本专栏使用软件为:SPSS25.0 本专栏所有的数据文件请点击此链接下…

红队攻防实战之钉钉RCE

我这一生如履薄冰,你说我能走到对岸吗? 本文首发于SecIN社区,原创作者即是本人 前言 网络安全技术学习,承认⾃⼰的弱点不是丑事。只有对原理了然于⼼,才能突破更多的限制。拥有快速学习能力的白帽子,是不…

vue3 教程(中)

侦听器 用于侦听指定变量,当其响应式状态变化时触发回调函数。 watch() watch() 需明确指定侦听的数据源,并且仅当数据源变化时,才会执行回调,在创建侦听器时,不会执行回调,可以获取到数据源变化前后的值…

Flutter 父子组件通信

在Flutter 中父组件调用子组件的方法可以通过GlobalKey实现&#xff0c;而子组件调用父组件方法可以通过回调函数实现。 父组件 class _MyHomePageState extends State<MyHomePage> {final GlobalKey<LoadPencilState> loadPencilKey GlobalKey<LoadPencilSt…

react中虚拟dom,diff,fiber - 初级了解

借鉴&#xff1a; 「React深入」一文吃透虚拟DOM和diff算法 - 掘金 (juejin.cn) 虚拟dom、fiber、渲染dom、dom-diff - 掘金 (juejin.cn) 未阅读源码&#xff0c;了解层面&#xff0c;后续可以深入了解 1.虚拟DOM ①.结构上&#xff1a;虚拟DOM比真实DOM轻很多 ②.操作上&…

主流的低代码平台有哪些?程序员应该如何与低代码相处?

本文主要阐述低代码的概念&#xff0c;介绍目前主流的低代码平台&#xff0c;总结低代码平台的典型特征、存在优势以及未来发展趋势。并站在程序员的角度&#xff0c;分析如何在已经到来的低代码战争中&#xff0c;找到自己的定位&#xff0c;一展所长。 什么是低代码&#xff…

脉冲宽度基础知识简介

脉冲宽度是指脉冲所能达到的最大值所持续的周期时间。脉冲宽度是电子领域中一个重要的概念&#xff0c;它与脉冲重复间隔和占空比等参数密切相关。 脉冲宽度通常用于电信号的测量&#xff0c;可以用来描述脉冲的形状、幅度和宽度等特性。在雷达和电源领域中&#xff0c;脉冲宽度…

Flink 替换 Logstash 解决日志收集丢失问题

在某客户日志数据迁移到火山引擎使用 ELK 生态的案例中&#xff0c;由于客户反馈之前 Logstash 经常发生数据丢失和收集性能较差的使用痛点&#xff0c;我们尝试使用 Flink 替代了传统的 Logstash 来作为日志数据解析、转换以及写入 ElasticSearch 的组件&#xff0c;得到了该客…

实现一个计算机

图片&#xff1a; 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>body {padding: 20px;font-family: Arial;}.calc-wrap {width: 300px;bor…

VL06O报表添加增强字段

业务描述 用户需要在VL06O事务代码下进行批量交货过账&#xff0c;现有的筛选条件不太适用当前公司的业务&#xff0c;需要在报表中新增三个交货单增强字段&#xff0c;方便其筛选&#xff08;选择屏幕没有加&#xff0c;用户在报表里用标准按钮功能自己筛选&#xff09; 效果…

十一 动手学深度学习v2计算机视觉 ——微调

一、网络架构 一个神经网络一般可以分成两块 特征抽取&#xff0c;将原始像素变成容易线性分割的特征。线性分类器来做分类。 二、训练 是一个目标数据集上的正常训练任务&#xff0c; 但使用更强的正则化 使用更小的学习率使用更少的数据迭代 源数据集远远复杂于目标数据集…

蓝桥杯算法双周赛心得——迷宫逃脱(dp)

大家好&#xff0c;我是晴天学长&#xff0c;dp版的来啦&#xff0c;可以是受益匪浅啊&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .迷宫逃脱 迷官逃脱[算法赛] 问题描述 在数学王国中&#xff0c;存…

便携式心电图机方案_基于MT6735平台的手持心电图机

便携式心电图机具备体积小、易携带、兼容12导模式的特点&#xff0c;通过工频滤波、基线滤波和肌电滤波等处理&#xff0c;能够获得更精准的心电图谱。该设备可以与医院信息系统(HIS)相连接&#xff0c;实现患者信息的共享。采集的心电数据可以通过无线方式发送到心电判读平台&…

企业建数仓的第一步是选择一个好用的ETL工具

当企业决定建立数据仓库&#xff08;Data Warehouse&#xff09;&#xff0c;第一步就是选择一款优秀的ETL&#xff08;Extract, Transform, Load&#xff09;工具。数据仓库是企业数据管理的核心&#xff0c;它存储、整合并管理各种数据&#xff0c;为商业决策和数据分析提供支…

PC8250(CC-CV控制)5V/8A同步降压恒流恒压软启动带EN功能只需极少外围元件

概述 PC8250是一个同步降压转换器输出电流至8A。它的设计允许操作电源电压范围从9V到42V。外部关闭功能可以通过逻辑电平来控制COMP/EN引脚下降&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线路和负载调节&#xff0c;外部设计灵活。PC8250在CC&#xff08;恒定…

【读懂AUTOSAR规范】PduR 缓存分配(Buffer allocation)

1. 前言 PDU路由器模块支持将I-PDU从一个源总线网关到一个或多个目标总线。与从/到本地模块的传输和接收不同,PDU路由器模块必须同时充当接收器和发射器,并且在某些情况下还提供I-PDU的缓冲。网关需求被有意地分离,以便在不需要网关的情况下高效实现PDU路由器模块。如果PDU…

华三无线控制器WX2540H配合准入做Portal认证

数据通信 - 建设篇 - 无线 第四章 华三无线控制器WX2540H配合准入做Portal认证 数据通信 - 建设篇 - 无线系列文章回顾华三无线控制器WX2540H配合准入做Portal认证前言其他配置优化参考来源系列文章回顾 第一章 华三无线控制器配置本地转发 第二章 华三无线控制器配置802.1X认…

Redis-Day1基础篇(初识Redis, Redis常见命令, Redis的Java客户端)

Redis-Day1基础篇 初识Redis认识NoSQL认识Redis安装Redis启动RedisRedis客户端 Redis命令数据结构介绍通用命令操作命令StringHashListSetSortedSet Redis的Java客户端客户端对比Jedis客户端Jedis快速入门Jedis连接池 SpringDataRedis客户端SpringDataRedis概述SpringDataRedis…