[C/C++]数据结构 LeetCode:用栈实现队列

news/2023/11/28 18:34:10

题目描述:

请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(pushpoppeekempty):

实现 MyQueue 类:

  • void push(int x) 将元素 x 推到队列的末尾
  • int pop() 从队列的开头移除并返回元素
  • int peek() 返回队列开头的元素
  • boolean empty() 如果队列为空,返回 true ;否则,返回 false

说明:

  • 你 只能 使用标准的栈操作 —— 也就是只有 push to toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

功能思路: 

在实现本题前,需要先构建好栈的基本功能,可以参考:http://t.csdnimg.cn/Kha16

1.出队列 和 入队列

现在我们有两个栈,假设在第一个栈中依次入栈1 2 3 4 5,另一个为空栈

现在要出队列的话,应该把1出队,所以需要把除了栈底元素的其他元素出栈并且入到第二个栈里,这时就可以将1出队,但是将数据导入另一个栈时,数据会倒过来

如果要再次出队列的话,应该把2出队,就不需要把数据导一次了,直接栈顶出栈即可.

若此时再入队6 7的话,可以直接把6 7入到第一个栈中,因为出栈可以直接再第二个栈中操作

所以我们可以把将一个栈专门用来入数据,另一个栈专门用来出数据,每次出队之前先判断出数据的栈是否为空,如果出数据那个栈不为空的话,直接出数据即可,否则就将入数据的栈中的数据导入出数据的栈中,再出栈.

2.返回队列开头元素

如果出数据的栈不为空,栈顶元素即为队列开头元素,否则就需要将入数据的栈的元素导入出数据的栈中,在返回栈顶元素

3.判空

两个栈同时为空,说明队列为空

参考代码:


typedef int STDataType;
typedef struct stack
{int* a;int top;int capacity;
}ST;void STInit(ST* ps)
{assert(ps);ps->a = NULL;ps->capacity = 0;ps->top = 0;  //top初始化位0,top的值可以表示栈元素的个数
}void STPush(ST* ps, STDataType x)
{assert(ps);//扩容if (ps->top == ps->capacity){int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;STDataType* ret = (STDataType*)realloc(ps->a,sizeof(STDataType)*newcapacity);if (ret == NULL){perror("realloc");return;}ps->a = ret;ps->capacity = newcapacity;}ps->a[ps->top] = x;ps->top++;
}void STPop(ST* ps)
{assert(ps);assert(ps->top);ps->top--;
}STDataType STTop(ST* ps)
{assert(ps);assert(ps->top);return ps->a[ps->top - 1];
}bool STEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}int STSize(ST* ps)
{assert(ps);return ps->top;
}void STDestroy(ST* ps)
{assert(ps);free(ps->a);ps->a == NULL;ps->top = ps->capacity = 0;
}typedef struct {ST Queuepush;ST Queuepop;
} MyQueue;MyQueue* myQueueCreate() {MyQueue *obj=(MyQueue*)malloc(sizeof(MyQueue));STInit(&obj->Queuepush);STInit(&obj->Queuepop);return obj;
}void myQueuePush(MyQueue* obj, int x) {STPush(&obj->Queuepush,x);
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->Queuepop)){while(!STEmpty(&obj->Queuepush)){STPush(&obj->Queuepop,STTop(&obj->Queuepush));STPop(&obj->Queuepush);}}return STTop(&obj->Queuepop);
}int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj);STPop(&obj->Queuepop);return front;
}bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->Queuepop)&&STEmpty(&obj->Queuepush);
}void myQueueFree(MyQueue* obj) {STDestroy(&obj->Queuepop);STDestroy(&obj->Queuepush);free(obj);
}


http://www.ppmy.cn/news/1227790.html

相关文章

最大食物链计数——拓扑排序

你知道食物链吗?Delia 生物考试的时候,数食物链条数的题目全都错了,因为她总是重复数了几条或漏掉了几条。于是她来就来求助你,然而你也不会啊!写一个程序来帮帮她吧。 给你一个食物网,你要求出这个食物网中…

拒绝服务攻击工具的编写

预计更新网络扫描工具的编写漏洞扫描工具的编写Web渗透测试工具的编写密码破解工具的编写漏洞利用工具的编写拒绝服务攻击工具的编写密码保护工具的编写情报收集工具的编写 拒绝服务攻击是一种恶意攻击,旨在使目标系统无法正常工作。这种攻击通常通过发送大量流量或…

验证码:EasyDL 机器学习识别与云码平台一站式识别

目录 EasyDL 机器学习识别(实践:京东商城) (一)批量获取验证码图片 (二)EasyDL机器学习(百度智能云) (三)调用EasyDLAPI接口识别验证码 云码…

【mysql】2006 - Server has gone away

执行了一组插入语句 提示:2006 - Server has gone away; 2006-服务器已经消失; 消失去哪里了,被黑洞吞没了吗?!!! 网络问题 网络不稳定?断网了?检查网络连…

【win32_000】视频截图

PPT 编译器不会自己添加unicode定义 v 函数 WinMain int __clrcall WinMain([in] HINSTANCE hInstance ,//应用程序的当前实例的句柄。[in, optional] HINSTANCE hPrevInstance ,//应用程序上一个实例的句柄。 此参数始终为 NULL。[in] …

天气这么好,都外出了。顺便了解一下漏桶算法

看到标题,你想到了些什么呢? 又是一个阳光明媚的周末,大家都外出了,路上到处堵车,尤其是各桥梁、隧道入口处,很多车排队等着进入,而出口处就像一个漏桶一样,一辆车接着一辆车有序且…

【数据库开发】DataX开发环境的安装部署(Python、Java)

文章目录 1、简介1.1 DataX简介1.2 DataX功能1.3 支持的数据通道 2、DataX安装配置2.1 DataX2.2 Java2.3 Python 3、DataX Web安装配置3.1 mysql3.2 DataX Web3.2.1 简介3.2.2 架构图3.2.3 依赖环境3.2.4 安装 4、入门使用4.1 DataX自带打印示例测试4.2 DataX生成任务模板文件4…

代码随想录算法训练营第25天|216.组合总和III 17.电话号码的字母组合

JAVA代码编写 216. 组合总和III 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。 示例 1: 输入: k …

【FPGA】IP核

一.IP核是什么 IP:知识产权,半导体产业中:在ASIC和FPGA中定义为预先设计好的电路功能模块。 在使用的时候其他用户可以直接调用IP核心。 二. 为什么要是有IP核 提高开发效率,减小设计和调试的时间,加速开发进程&am…

关于这个“这是B站目前讲的最好的【Transformer实战】教程!“视频的目前可以运行的源代码GPU版本

课程链接如下: 2.1认识Transformer架构-part1_哔哩哔哩_bilibili 因为网上可以找到源代码,但是呢,代码似乎有点小错误,我自己改正后,放到了GPU上运行, 代码如下: # 来自https://www.bilibil…

Git详解及 github使用

1.1 关于版本控制 开始之前先看一个没有版本控制的例子 1.1.1 本地版本控制 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的 好处就是简单,但是特别容易犯错。有时候会混淆所在…

pip相关操作

配置pip源 在vi ~/.pip/pip.conf文件中配置 [global] index-url https://pypi.tuna.tsinghua.edu.cn/simple 安装具体的包 pip install ntlm-auth1.5.0 下载具体的包 pip download -d ./package ntlm-auth1.5.0 批量下载包 例如创建requirements.txt文件: cat…

2311rust,到66版本更新

1.60.0稳定版 基于源码的代码覆盖率 rustc中已稳定支持基于LLVM的覆盖率检测.可用-Cinstrument-coverage重构代码,如: RUSTFLAGS"-C instrument-coverage" cargo build之后,运行生成的二进制文件,它在当前目录中生成一个default.profraw文件.环境变量可覆盖路径和…

js 处理时间格式——可指定时区进行转换

不同时区,对时间进行格式化处理,获取为指定时区时间。 (注:new Date()不进行处理则获取到为本地时区的时间) js // 处理时间的方法// 此处的i为8是北京东八区的时间,如果是西n区,则此处为&#…

《LeetCode力扣练习》代码随想录——链表(链表相交---Java)

《LeetCode力扣练习》代码随想录——链表(链表相交—Java) 刷题思路来源于 代码随想录 面试题 02.07. 链表相交 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* …

【diffuser系列】ControlNet

ControlNet: TL;DRControl TypeStableDiffusionControlNetPipeline1. Canny ControlNet1.1 模型与数据加载1.2 模型推理1.3 DreamBooth微调 2. Pose ControlNet2.1 数据和模型加载2.2 模型推理 ControlNet: TL;DR ControlNet 是在 Lvmin Zhang 和 Maneesh Agrawala 的 Adding …

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…

【Redis】zset常用命令集合间操作内部编码使用场景

文章目录 前置知识列表、集合、有序集合三者的异同点 普通命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXBZPOPMAXZPOPMINBZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY 集合之间的操作ZINTERSTOREZUNIONSTORE 命令小结内部编码测试内部编…

北邮22级信通院数电:Verilog-FPGA(10)第十周实验 实现移位寄存器74LS595

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 二.管脚分配 三.实现过程讲解及效…

redis+python 建立免费http-ip代理池;验证+留接口

前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…
最新文章