当前位置: 首页 > news >正文

ledcode【用队列实现栈】

目录

题目描述:

解析题目

 代码解析

1.封装一个队列

1.2封装带两个队列的结构体

1.3封装指向队列的结构体

1.4入栈函数实现

1.5出栈函数实现

1.6取栈顶数据

1.7判空函数实现


 

题目描述:

解析题目

这个题我是用c语言写的,所以队列的push,pop,destroy,empty等常规操作我都写好了,后面我会单独出一个章节,写 队列的实现,这章主要想梳理做题步骤。

队列是先进先出,栈呢是先进后出,所以我们要用两个队列配合使用,让后进去的,先出来,我们可以选择其中一个空队列,讲所有数据一次push入队,然后利用另外一个队列,将这个非空的队列的队头数据,依次如到另一个空的队列,折旧就把最后一个进队的数据保留下来了 这次在pop一下就完成了 题目的要求 最后进的 第一个出来,而且该队列为空了;同时,再接下来,入过有数据,一定要让它入非空队列,然后再执行上述操作,就可以又把最后一个数据单独留在一个队里中,再pop就完成栈的后进先出的操作了。详解图如下所示:

 

 代码解析

 

1.封装一个队列

#include<stdio.h>
#include<assert.h>
#include<stdbool.h>
#include<stdlib.h>typedef int QDataType;
//定义节点
typedef struct QueueNode
{QDataType data;struct QueueNode* next;}QNode;
//定义指向头和尾的指针
typedef struct	Queue
{QNode* head;QNode* tail;int size;
}Queue;void QueueInit(Queue* pq)
{pq->head = pq->tail = NULL;pq->size = 0;}
//销毁
void QueueDestroy(Queue* pq)
{assert(pq);QNode *cur = pq->head;while (cur){QNode* next = cur->next;	free(cur);cur = next;}pq->head = pq->tail = NULL;pq->size = 0;}
QNode* BuyQNode(QDataType x)
{QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc:fail");exit(-1);}newnode->data = x;newnode->next = NULL;return newnode;
}
//进队
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QNode* newnode = BuyQNode(x);if (pq->head == NULL){pq->head = pq->tail= newnode;}else{pq->tail->next = newnode;pq->tail = newnode;}pq->size++;
}
//判空
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->head == NULL && pq->tail == NULL;}
//出队
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->head->next == NULL){free(pq->head);pq->head = pq->tail = NULL;}else{QNode* del = pq->head;//结构体成员head 是QNode 类型指针pq->head = pq->head->next;free(del);}pq->size--;}
//队头
QDataType QueueFront(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->head->data;} //队尾
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->tail->data;}//个数
int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}

1.2封装带两个队列的结构体

因为是用ledecode写的代码,所以写的代码都按照他给定的封装结构编写,具体代码如下:

//两个队列封装在一个结构体中 重定义为 Mystack
typedef struct {Queue q1;Queue q2;
} MyStack;

1.3封装指向队列的结构体

题目中已经给了接口函数,我们只能在接口函数内部,完成要求,具体代码如下

MyStack* myStackCreate() {MyStack *obj = ( MyStack *)malloc(sizeof(MyStack));//定义一个结构体指针变量,QueueInit(&obj->q1);//初始化QueueInit(&obj->q2);return obj;}

因为题目给是返回的是mystack*结构指针变量,所以 函数内部,我们定义一个指针变量,用来接收在堆上申请的同类型的空间地址,这样虽然出了子程序后,变量obj会被释放,但是地址我们已经返回,并且堆上的空间已经被返回,我们可以通过地址访问这块空间。

1.4入栈函数实现

void myStackPush(MyStack* obj, int x) {if(!QueueEmpty(&obj->q1)){QueuePush(&obj->q1,x);}else{QueuePush(&obj->q2,x);}}

这个就很简单,如果队列1为空就把数据入队,反之入队列2。

1.5出栈函数实现

int myStackPop(MyStack* obj) {
//写一个判断队列1和队列2谁为空的代码Queue *emptyQueue = &obj->q1;  //定义一个指针变量 emptyQueue,就要取出obj->q1的地址来匹配Queue *noemptyQueue = &obj->q2;if(!QueueEmpty(&obj->q1)){noemptyQueue = &obj->q1;emptyQueue = &obj->q2;}
//将不为空的队列除了最后一个数据其他数据都入到另一个空队中while(QueueSize(noemptyQueue)>1){QueuePush(emptyQueue,QueueFront(noemptyQueue));//取队头数据,依次如另一个队中QueuePop(noemptyQueue);//出一个数据,要pop一下}int top = QueueFront(noemptyQueue);//因为要返回 栈的数据,所以用一个整形变量接收QueuePop(noemptyQueue);return top;
}

 用两个结构体指针变量接收队列1 和2 判断出他们中为不空的队列,然后依次入空的队列,保留最后一个数据,取出返回,就完成啦,每个代码的解析我都写出来了。

1.6取栈顶数据

int myStackTop(MyStack* obj) {if(!QueueEmpty(&obj->q1)){return  QueueBack(&obj->q1);}else{return QueueBack(&obj->q2);}
}

 就是将不为空的队列的队尾数据返回就行。

1.7判空函数实现

bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);}

 表达式 的意思是 两个队列同时为空 才为真 返回true 否则返回false

1.8销毁函数实现

void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);}

我们需要先将,队列1和队列2 销毁,再将0bj这个指针变量置空,如果直接置空obj,那么结构体里面的队列还是有指向,不会销毁,这样会造成内存泄漏,如下图所示:

相关文章:

ledcode【用队列实现栈】

目录 题目描述&#xff1a; 解析题目 代码解析 1.封装一个队列 1.2封装带两个队列的结构体 1.3封装指向队列的结构体 1.4入栈函数实现 1.5出栈函数实现 1.6取栈顶数据 1.7判空函数实现 题目描述&#xff1a; 解析题目 这个题我是用c语言写的&#xff0c;所以队列的pu…...

【基础算法】双指针----字符串删减

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…...

Billu靶场黑盒盲打——思路和详解

一、信息收集 1、探测内网主机IP可以使用各种扫描工具比如nmap&#xff0c;我这里用的是自己编写的。 nmap -n 192.168.12.0/24 #扫描IP&#xff0c;发现目标主机 2、先不着急&#xff0c;先收集一波它的端口&#xff08;无果&#xff09; nmap -n 192.168.12.136 -p 1-10000…...

【2363. 合并相似的物品】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你两个二维整数数组 items1 和 items2 &#xff0c;表示两个物品集合。每个数组 items 有以下特质&#xff1a; items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 &#xff0c;we…...

【C++提高编程】C++全栈体系(二十四)

C提高编程 第三章 STL - 常用容器 九、map/ multimap容器 1. map基本概念 简介&#xff1a; map中所有元素都是pairpair中第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个元素为value&#xff08;实值&#xff09;所有元素都会根…...

c++11 标准模板(STL)(std::unordered_set)(十一)

定义于头文件 <unordered_set> template< class Key, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator<Key> > class unordered_set;(1)(C11 起)namespace pmr { templ…...

AI/CV大厂笔试LeetCode高频考题之基础核心知识点

AI/CV互联网大厂笔试LeetCode高频考题之基础核心知识点算法复习1、二叉树的遍历2、回溯算法3、二分搜索4、滑动窗口算法题5、经典动态规划6、动态规划答疑篇6.1、总结一下如何找到动态规划的状态转移关系7、编辑距离8、戳气球问题9、最长公共子序列 Longest Common Subsequence…...

华为OD机试题,用 Java 解【静态扫描最优成本】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

常见无线技术方案介绍

无线技术 无线网络大体有两种&#xff1a;WAN&#xff08;广域网&#xff09;、PAN&#xff08;个人区域网&#xff09;。 对于LoRa&#xff0c;NB-IoT&#xff0c;2G / 3G / 4G等无线技术&#xff0c;通常传输距离超过1 km&#xff0c;因此它们主要用于广域网&#xff08;WA…...

收获满满的2022年

收到csdn官方的证书&#xff0c;感谢官方的认可&#xff01;...

react的生命周期

目录 一、初始化阶段 constructor() static getDerivedStateFromProps() componentWillMount() / UNSAFE_componentWillMount() render()&#xff1a; componentDidMount() 二、运行阶段 componentWillUpdate() / UNSAFE_componentWillUpdate() render() getSnapsh…...

scanpy 单细胞分析API接口使用案例

参考&#xff1a;https://zhuanlan.zhihu.com/p/537206999 https://scanpy.readthedocs.io/en/stable/api.html scanpy python包主要分四个模块&#xff1a; 1&#xff09;read 读写模块、 https://scanpy.readthedocs.io/en/stable/api.html#reading 2&#xff09;pp Prepr…...

【Vue3 第二十一章】Teleport组件传送

一、基本使用场景 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看&#xff0c;它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。 这类场景最常见的例子就是全屏的模态框。理想情况下&#…...

在 Windows Subsystem for Linux (WSL2) 的 Ubuntu 系统上配置 Vulkan 开发环境

在 Windows Subsystem for Linux (WSL2) 的 Ubuntu 系统上配置 Vulkan 开发环境Vulkan Tutorial https://vulkan-tutorial.com/ Development environment - Linux https://vulkan-tutorial.com/Development_environment 1. Vulkan - Cross platform 3D Graphics https://www…...

放苹果HJ61

入门题目 把m个同样的苹果放在n个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;注意&#xff1a;如果有7个苹果和3个盘子&#xff0c;&#xff08;5&#xff0c;1&#xff0c;1&#xff09;和&#xff08;1&#xff0c;5&#…...

Windows下,OPC UA移植,open62541移植

OPC通信标准的核心是互通性 (Interoperability) 和标准化 (Standardization) 问题。传统的OPC技术在控制级别很好地解决了硬件设备间的互通性问题,在企业层面的通信标准化是同样需要的。OPC UA之前的访问规范都是基于微软的COM/DCOM技术, 这会给新增层面的通信带来不可根除的…...

【Tomcat与Servlet篇1】认识Tomcat与Maven

目录 一、什么是Tomcat 二、Tomcat的几个重要目录 conf文件​编辑 Server.xml logs文件 Webapps目录 三、如何使用Tomcat 但是&#xff0c;如果出现了点击之后进行闪退的情况&#xff0c;那又是怎么回事呢&#xff1f; 原因1&#xff1a;环境变量没有配置 原因2&#…...

C++类和对象:拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1.1 什么是拷贝构造函数 1.2 编译器默认生成的拷贝构造函数 1.3 拷贝构造函数特性总结 二. 运算符重载 2.1 运算符重载概述 2.2 比较运算符重载&#xff08;> > < <&#xff09; 2.2.1 >运算符的重载 2.2.2 运算符的重载 2.…...

【IntelliJ IDEA】idea plugins搜索不出来,如何找到插件的解决方案

一、背景描述安装好IDEA后&#xff0c;想下载一些插件来使用&#xff0c;因为IDEA非常方便的一点就是插件使用非常的方便&#xff0c;但是经常会发现进入到插件市场无法搜索到插件的情况&#xff0c;这个时候就有点烦人了。那么怎么解决这个问题呢&#xff1f;以下会把我能想到…...

移动端自动化测试(一)appium环境搭建

自动化测试有主要有两个分类&#xff0c;接口自动化和ui自动化&#xff0c;ui自动化呢又分移动端的和web端的&#xff0c;当然还有c/s架构的&#xff0c;这种桌面程序应用的自动化&#xff0c;使用QTP&#xff0c;只不过现在没人做了。 web自动化呢&#xff0c;现在基本上都是…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...