用队列实现栈——leetcode刷题

        题目的要求是用两个队列实现栈,首先我们要考虑队列的特点:先入先出,栈的特点:后入先出,所以我们的目标就是如何让先入栈的成员后出栈,后入栈的成员先出栈。

        因为有两个队列,于是我们可以这样想:让 队列1 的成员除最后一个成员出队列到 队列2,这时 队列1 剩下的成员不就是要出栈的成员吗?(即后入先出)那么我们如何控制让 队列1 出队列到只剩下一个成员呢?我们可以使用size函数,即 size(队列1) 是1的时候再Pop或者Peek,就是出栈。如图所示:


        我没有提到入栈,入栈其实就是把数据按照顺序放进 队列1 中,因为队列和栈在存储数据方面都是顺序存放的,只有在出数据的时候顺序不同,这里的 队列1 就可以理解为栈的拷贝,队列2 就可以理解为出栈的工具,因为只有在出栈时才会占用 队列2 。

        Pop完或者Peek查看完并没有结束,我们要把 队列2 中的成员再归还到 队列1 中,如果是Pop(出栈函数,删除栈顶数据),那么 队列2 直接出队列到 队列1 即可,如果是Peek(查看栈顶数据,不删除),那么 队列1 中的成员要先出队列到 队列2 在执行出队列到 队列1 的操作,如图:

接下来是代码实现,

首先还是创建栈结构体和结构体中的两个队列:


struct QueueList {int val;struct QueueList* next;
};
struct Queue {struct QueueList* head;struct QueueList* tail;
};
typedef struct {struct Queue* q1;struct Queue* q2;
} MyStack;MyStack* myStackCreate() {MyStack* stack=(MyStack*)malloc(sizeof(MyStack));stack->q1=(struct Queue*)malloc(sizeof(struct Queue));stack->q2=(struct Queue*)malloc(sizeof(struct Queue));QueueInit(stack->q1);QueueInit(stack->q2);return stack;
}

        主要是最后两块代码,创建栈结构体并且为栈申请空间。这里我一开始犯了一个错误,没有给每个队列的指针申请空间,导致q1和q2是野指针,所以也提醒了我一次malloc是为两个指针存放开辟空间, 但并没有为指针指向的位置开辟空间,导致野指针的问题。所以要二次malloc为队列指针开辟空间。

接着是入栈函数:

void myStackPush(MyStack* obj, int x) {QueuePushBack(obj->q1,x);
}

        直接就是把数据放进 队列1 q1中去。

然后是Pop(出栈函数,删除栈顶)和Peek(查看栈顶成员函数):

int myStackPop(MyStack* obj) {while(Queue_size(obj->q1)>1){QueuePushBack(obj->q2,QueueFrontPop(obj->q1));}int val=QueueFrontPop(obj->q1);while(Queue_size(obj->q2)>0){QueuePushBack(obj->q1,QueueFrontPop(obj->q2));}return val;
}int myStackTop(MyStack* obj) {while(Queue_size(obj->q1)>1){QueuePushBack(obj->q2,QueueFrontPop(obj->q1));}int val=QueueFrontPop(obj->q1);QueuePushBack(obj->q2,val);while(Queue_size(obj->q2)>0){QueuePushBack(obj->q1,QueueFrontPop(obj->q2));}return val;
}

        每个函数中都有两个while循环,第一个是将 队列1 q1 的成员拷贝到 队列2 q2 ,第二个是将 队列2 q2 的成员拷贝到 队列1 q1。
        先解释一下Pop函数,根据刚才的流程图,当size>1时,就是说只有一个成员时停止拷贝,这时把最后的值Pop掉并记录,然后当size>0时,就是说把 q2 的成员全部拷贝回 q1,然后返回Pop掉的值。
        Peek函数只改变了一点,就是Pop改为Peek,记录下栈顶成员,然后接着把 q1 拷贝回 q2,再整个队列拷贝回 q2。

最后是检查是否为空 Is_empty 函数和销毁内存函数:

bool myStackEmpty(MyStack* obj) {if(Queue_size(obj->q1)==0){return true;}else{return false;}
}void myStackFree(MyStack* obj) {QueueDes(obj->q1);QueueDes(obj->q2);free(obj);
}

        因为每次调用函数过后 队列1 q1 就相当于栈,所以只需要检查 队列1 是否为空即可。

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎评论。

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

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

相关文章

vue3(实现上下无限来往滚动)

一、问题描述 一般在大屏项目中,很常见的效果,就是容器中的内容缓慢地向下移动,直到底部停止,然后快速滚动回顶部,然后接着缓慢滚动到底部。并且在特定的情况下,还需要进行一些小交互,那就还得让…

Leetcode——面试题02.04.分割链表

面试题 02.04. 分割链表 - 力扣(LeetCode) 对于该链表OJ,我们两种大的方向: 1.在原链表上修改;2.创建新链表,遍历原链表。 在原链上进行修改:如果该节点的val小于x则继续往后走,如…

Ubuntu服务器创建新用户及解决新用户登录Access denied问题

目录 Ubuntu服务器创建新用户及解决新用户登录Access denied问题创建账号步骤创建用户只创建用户添加用户到sudo组 允许账号远程连接重启ssh服务 删除账号要删除用户而不删除用户文件如果要删除并且删除用户的家目录和邮件 查询指令查看所有用户查询特定用户账户信息查看用户组…

【Micropython Pitaya Lite教程】key按键与EXTI中断

文章目录 前言一、按键的使用1.1 按键的简介1.2 读取按键的高低电平 二、EXIT外部中断2.1 EXIT外部中断简介2.2 外部中断基础知识2.3 设置外部中断2.4 示例代码 总结 前言 Micropython Pitaya Lite开发板提供了丰富的功能和灵活的扩展性,其中包括了按键&#xff08…

Python 全栈系列241 GFGo Lite迭代

说明 随着整个算网开发逐渐深入,各个组件、微服务的数量、深度在不断增加。由于算网是个人项目,我一直按照MVP(Minimum Viable Product )的原则在推进。由于最初的时候对架构、算法和业务的理解并没有那么深刻,所以MVP的内容还是在不断变化&…

IoTDB 入门教程 基础篇①——时序数据库为什么选IoTDB ?

文章目录 一、前文二、性能排行第一三、完全开源四、数据文件TsFile五、乱序数据高写入六、其他七、参考 一、前文 IoTDB入门教程——导读 关注博主的同学都知道,博主在物联网领域深耕多年。 时序数据库,博主已经用过很多,从最早的InfluxDB&a…

Linux基础之yum和vim

目录 一、软件包管理器yum 1.1 软件包的概念 1.2 软件包的查看 1.3 软件包的安装和删除 二、Linux编辑器之vim 2.1 vim的基本概念 2.2 正常模式(命令模式) 2.3 底行模式 2.4 输入模式 2.5 替换模式 2.6 视图模式 2.7 总结 一、软件包管理器yu…

MATLAB可视化图形绘制详解

图形常见的修饰命令 ①曲线修饰 曲线修饰包括曲线的顔色、线型和标示符号的设置。曲线修饰的命令格式如下。 plot(x,y,option):option定义了曲线的颜色、线型和标示符号。 MATLAB曲线修饰的各种选项见表 举例: x-2*pi:pi/50:2*pi; y1x.^2;y2cos(2*X);y3y1.*y2…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介:使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介:用户们可以在系统上面录入自己的个人信息,录入后还可以对信息进行修改,网站可以对用户上传的音频文件进行识别,然后进行垃圾分类。 背景&#xf…

【竞技宝jjb.lol】LOL:TES顺利晋级却暴露问题

北京时间2024年5月5日,英雄联盟2024MSI季中赛正在如火如荼的进行之中,目前入围赛阶段的比赛已经进入尾声,入围赛实力最强的两支战队T1、TES都已经顺利晋级淘汰赛阶段,在昨天的比赛结束之后,A组的FLY、PSG,B组的FNC、GAM将争夺剩下的两个出线名额。 回顾这次入围赛中,T1和TES的比…

课题学习(二十三)---三轴MEMS加速度计芯片ADXL372

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。 一、基础配置 测量范围-200g-200g,分辨率为12位, V s 、 V D D I / O V_s、V_{DDI/O} Vs​、VDDI/O​范围为1.6V-3.5V 1.1 引脚配…

u盘格式化后电脑读不出来怎么办?u盘格式化的东西还能恢复吗

随着科技的快速发展,U盘已成为我们日常生活和工作中不可或缺的数据存储工具。然而,有时我们可能会遇到U盘格式化后电脑无法读取的情况,或是误格式化导致重要数据丢失。面对这些问题,我们该如何应对?本文将为您详细解答…

基于 Dockerfile 部署nginx服务(实现HTTPS功能)

目录 前言 1、任务要求 2、建立工作目录并上传nginx安装包 3、创建自签名证书 4、创建 nginx Dockerfile 文件 5、准备并编写 nginx.conf 配置文件 6、准备nginx页面文件 7、工作目录文件结构 8、生成镜像 8、启动容器并开启宿主机端口映射 9、浏览器测试 前言 Ngi…

电子电器架构刷写 --- Bootloader大揭秘

电子电器架构刷写 — Bootloader大揭秘 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自…

c语言刷题——输出图案

1.输出用“*”组成的X形图案 题目:请打印用“*”组成的X形图案 描述: 多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。 输出描述: 针对每行输…

大语言模型中的第一性原理:Scaling laws

大语言模型的尺度定律在大语言模型的训练过程中起到了非常重要的作用。即使读者不参与大语言模型的训练过程,但了解大语言模型的尺度定律仍然是很重要的,因为它能帮助我们更好的理解未来大语言模型的发展路径。 1. 什么是尺度定律 尺度定律&#xff08…

Docker入门篇来啦~

文章目录 1虚拟化技术1.1 硬件级虚拟化1.2 操作系统级虚拟化 2 Docker是什么2.1 Docker介绍2.2 容器和虚拟机的区别2.3 为什么使用Docker 3 Docker运行环境部署3.1 Docker安装3.2 Docker服务启动 4 Docker核心组件4.1 镜像4.1.1 镜像的基本概念4.1.2 镜像的组成结构4.1.3 镜像的…

Java 三大特性之继承

目录 一、为什么需要继承? 二、继承概念 三、继承的语法 四、子类访问父类成员 五、super关键字 六、继承关系下的构造方法 七、继承关系下的初始化 八、protected关键字 九、继承的三种方式 十、final关键字 十一、继承和组合 一、为什么需要继承&#…

C语言——rand函数

一、rand函数 这是一个在 C 标准库 <stdlib.h> 中定义的函数&#xff0c;用于生成伪随机数&#xff0c;默认情况下&#xff0c;它生成从 0 到 RAND_MAX 的伪随机数&#xff0c;其中 RAND_MAX 是一个常数&#xff0c;通常是 32767。 1、函数原型&#xff1a; 2、函数返回…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…