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.hqwc.cn/news/212276.html

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

相关文章

微服务保护 Sentinel

1.初识Sentinel 文章目录 1.初识Sentinel1.1.雪崩问题及解决方案1.1.1.雪崩问题1.1.2.超时处理1.1.3.仓壁模式1.1.4.断路器1.1.5.限流1.1.6.总结 1.2.服务保护技术对比1.3.Sentinel介绍和安装1.3.1.初识Sentinel1.3.2.安装Sentinel 1.4.微服务整合Sentinel 2.流量控制2.1.簇点链…

【Vue】创建第一个实例

步骤&#xff1a; 1.创建容器 2.引包 3.创建实例 4.添加配置项 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><!--准备容器 --> <di…

轻松搞定HTTP接口测试,JMeter让你事半功倍!

jmeter-http接口测试脚本 jmeter进行http接口测试的主要步骤&#xff08;1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL&#xff0c;路径&#xff0c;请求方式&#xff0c;参数 4.添加查看结果树 5.调用接口&#xff0c;查看返回值&#xff09; 针对接口添加heade…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…

JavaScript编程基础 – 布尔值(Booleans)

JavaScript编程基础 – 布尔值(Booleans) Javascript Programming Essentials – Booleans 一个JavaScript布尔值包含两个值中的一个&#xff0c;即 true 或者 false。 本文简要介绍JavaScript布尔值的具体应用&#xff0c;以及可能作为对象的布尔值等。 1. 布尔值(Booleans)…

python pytorch教程-带你从入门到实战(代码全部可运行)

python pytorch教程-带你从入门到实战&#xff08;代码全部可运行&#xff09; 其实这个教程以前博主写过一次&#xff0c;不过&#xff0c;这回再写一次&#xff0c;打算内容写的多一点&#xff0c;由浅入深&#xff0c;然后加入一些实践案例。 下面是我们的内容目录&#x…

Redis深入理解-内核请求处理流程、数据传输协议

Redis 内核级请求处理流程 Redis Server 其实就是 Linux 服务器中的一个进程 主要还是下图的流程 应用先和 server 端建立 TCP 连接建立连接之后&#xff0c;server 端就会有一个与该客户端通信的 socket&#xff0c;客户端的读写请求发送到服务端的 socket那么通过 IO 多路…

spark的算子

spark的算子 1.spark的单Value算子 Spark中的单Value算子是指对一个RDD中的每个元素进行操作&#xff0c;并返回一个新的RDD。下面详细介绍一些常用的单Value算子及其功能&#xff1a; map&#xff1a;逐条映射&#xff0c;将RDD中的每个元素通过指定的函数转换成另一个值&am…

Laravel 安装(笔记一)

目录 第一步、Laravel 一般使用 composer安装 第二步、使用composer安装项目 第三步、配置环境 第四步、访问域名&#xff0c;安装完成 Laravel 官网 l​​​​​​​Installation - Laravel 中文网 为 Web 工匠创造的 PHP 框架 第一步、Laravel 一般使用 composer安装 如…

java项目之消防物资存储系统(ssm+vue)

项目简介 消防物资存储系统实现了以下功能&#xff1a; 管理员功能: 管理员登陆后&#xff0c;主要模块包括首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;仓库管理&#xff0c;物资入库管理&#xff0c;物资出库管理&#xff0c;仓库管理&#xff0c;物资详情管…

基于Pytest+Requests+Allure实现接口自动化测试!

一、整体结构 框架组成&#xff1a;pytestrequestsallure 设计模式&#xff1a; 关键字驱动 项目结构&#xff1a; 工具层&#xff1a;api_keyword/ 参数层&#xff1a;params/ 用例层&#xff1a;case/ 数据驱动&#xff1a;data_driver/ 数据层&#xff1a;data/ 逻辑层&…

jetson xavier NX深度学习环境配置

文章目录 jetson xavier NX深度学习环境配置1. SD卡系统烧录1.1 材料1.2 软件配置1.3 格式化SD卡1.4 系统镜像烧录 2. 环境配置2.1 cuda环境配置2.2 安装依赖库2.3 安装python及依赖环境2.4 安装pytorch环境 jetson xavier NX深度学习环境配置 1. SD卡系统烧录 1.1 材料 SD …