[链表OJ题 8] 用栈实现队列,没想到你小子的基础这么好,这么快就做对了

news2024/10/7 10:23:35

目录

题目来源:

代码实现:

思路分析:

实现过程:


题目来源:

力扣 - 232.用栈实现队列

题目描述:

代码实现:

我们这里的栈已经写好了,如果对栈还不是很懂的可以看看这篇文章:CSDN - [数据结构 -- C语言] 栈(stack)

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;		// 栈顶
	int capacity;  // 容量 
}Stack;
// 初始化栈 
void StackInit(Stack* ps);
// 入栈 
void StackPush(Stack* ps, STDataType data);
// 出栈 
void StackPop(Stack* ps);
// 获取栈顶元素 
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数 
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps);
// 销毁栈 
void StackDestroy(Stack* ps);
// 初始化栈 
void StackInit(Stack* ps)
{
	assert(ps);

	ps->a = NULL;
	//ps->top = -1;//top 指栈顶数据
	ps->top = 0;//top 指栈顶数据的下一个位置
	ps->capacity = 0;
}
// 入栈 
void StackPush(Stack* ps, STDataType data)
{
	assert(ps);

	if (ps->capacity == ps->top)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail:");
			return;
		}
		ps->a = tmp;
		ps->capacity = newcapacity;
	}

	ps->a[ps->top] = data;
	ps->top++;
}
// 出栈 
void StackPop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	ps->top--;
}
// 获取栈顶元素 
STDataType StackTop(Stack* ps)
{
	assert(ps);
	assert(!StackEmpty(ps));

	return ps->a[ps->top-1];
}
// 获取栈中有效元素个数 
int StackSize(Stack* ps)
{
	assert(ps);

	return ps->top;
}
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0 
int StackEmpty(Stack* ps)
{
	assert(ps);

	if (0 == ps->top)
		return 1;
	else
		return 0;
}
// 销毁栈 
void StackDestroy(Stack* ps)
{
	assert(ps);

	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

typedef struct {
    Stack push;
    Stack pop;
} MyQueue;

MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    StackInit(&obj->push);
    StackInit(&obj->pop);

    return obj;
}

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

int myQueuePop(MyQueue* obj) {
    int front = myQueuePeek(obj);
    StackPop(&obj->pop);
    return front;
}

int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->pop))
    {
        while(!StackEmpty(&obj->push))
        {
            StackPush(&obj->pop, StackTop(&obj->push));
            StackPop(&obj->push);
        }
    }
    return StackTop(&obj->pop);
}

bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->push) && StackEmpty(&obj->pop);
}

void myQueueFree(MyQueue* obj) {
    StackDestroy(&obj->push);
    StackDestroy(&obj->pop);
}

思路分析:

我们知道队列的特性:先入先出;栈的特性:先入后出。因此我们定义两个栈,一个是入元素的栈(push栈),另一个是出元素的栈(pop栈)。当我们要入队的时候就把元素直接入到 push栈中,出队的时候先把 push栈 中的元素全部放入 pop栈 中,将 pop栈 的栈顶元素出栈就能实现队列的特性。

此题的本质是以栈的特性来实现队列的特性。

实现过程:

1、我们先将栈的所有接口都写出来。然后我们创建两个栈,一个是实现入队功能的栈(push栈),另一个是实现出队功能的栈(pop栈);

2、我们要实现入队的时候,将元素入到 push栈 中,要出队的时候先将 push栈 中的元素转到 pop栈 中,然后出pop栈 这样就可以实现出队时出的是队头元素;

3、在出队的时候我们先看 pop栈 中还有没有元素,要是有元素我们直接出 pop栈 中的栈顶元素就可以,如果没有就先将 push栈 中的元素转到 pop栈 中;入队的时候直接入到 push栈 中就可以。

对栈还不太明白的朋友可以参考代码实现那部分的 的那篇文章。

*** 本篇结束 ***

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

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

相关文章

Postman接口工具之请求运行顺序及Workflow

作为一款接口调试利器, Postman的更新迭代速度很快, 不断加入了很多新的功能.使的api设计,测试,监控, Mock,以及团队协作更加方便. 修改执行顺序 在遇到有接口依赖的情况, 我们往往需要接口按顺序执行, 之前可以通过在一个请求的Pre-request Scripts中使用pm.sendRequest发送…

java基于springboot应急科研科技资源管理系统

应急资源管理系统的开发,主要有管理员和用户两个角色。 管理员角色计划设计的功能有密码信息管理、个人信息管理、用户信息管理、应急资源管理、留言信息管理等模块,管理员可以对用户、应急资源、留言等信息进行管理,可以选择添加、修改、删除…

ADC常用的十大滤波算法(C语言)

目录 ​编辑 ​一、限幅滤波法 二、中位值滤波法 三、算术平均滤波法 四、递推平均滤波法 五、中位值平均滤波法 六、限幅平均滤波法 七、一阶滞后滤波法 八、加权递推平均滤波法 九、消抖滤波法 十、限幅消抖滤波法 ​一、限幅滤波法 1、方法: 根据经验…

系列1——geotools简介

geotools简介 官网 https://docs.geotools.org/latest/userguide/index.html 架构图 常用功能列表 ModulePurposegt-renderImplements of Java2D rendering engine to draw a mapgt-jdbcImplements for accessing spatial databasegt-mainImplements for accessing spatial…

搭建一个Fabric网络

生成相关证书文件 首先Fabric提供了一些工具用于生成所需的文件,cryptogen模块会根据提供的配置文件生成后续模块运行过程中需要的证书和数据文件。 cryptogen常用命令: generate用于根据配置文件生成证书。 showtemplate用于提供一个模板。 具体操作如…

ROS学习——rviz打开bag文件

一、首先可以在这个网站中下载.bag文件用于学习。 二、显示.bag文件信息 在终端1中启动&#xff1a; roscore 在终端2中输入&#xff1a; rosbag info <bag_file_name> 这里要把<bag_file_name>换成你自己的bag文件名字&#xff0c;之后在终端就会显示出bag文件…

Lidar AI Solution环境配置

目录 Lidar AI Solution环境配置前言1. Lidar AI Solution1.1 Pipeline overview1.2 GetStart 2. CUDA-BEVFusion2.1 3D目标检测(nuScenes验证集)2.2 演示2.3 模型和数据2.4 前置条件2.5 快速开始推理2.5.1 下载模型和数据到CUDA-BEVFusion文件夹2.5.2 配置environment.sh2.5.3…

力扣贪心算法专题(三)力扣题 452、435、763、56、738、968、714 思路及C++实现

文章目录 贪心算法452. 用最少数量的箭引爆气球435. 无重叠区间做法1 右边界排序 不重叠区间做法2 右边界排序 不重叠区间做法3 左边界排序 重叠区间 763.划分字母区间做法1做法2 56. 合并区间738.单调递增的数字暴力解法贪心算法 968.监控二叉树714.买卖股票的最佳时机含手续费…

CSDN周赛55期 - 简单分析

上期周赛被判抄袭了。。。无语。我从第一期周赛一步步走来&#xff0c;所有题我都做过&#xff0c;我还需要抄袭&#xff1f; 虽然第一时间去申诉&#xff0c;但貌似并没什么用。算了&#xff0c;C站的审核也就这样了&#xff0c;失望寒心。 本期还是《计算之魂》主题赛——不得…

JavaScript 基础 DOM (四)

正则表达式正则表达式 正则基本使用 定义规则 const reg /表达式/其中/ /是正则表达式字面量正则表达式也是对象 使用正则 test()方法 用来查看正则表达式与指定的字符串是否匹配 如果正则表达式与指定的字符串匹配 &#xff0c;返回true&#xff0c;否则false reg.test(…

eclipse环境配置

eclipse环境配置 0. 前言1. 下载eclipse2. 下载sdk3. 配置sdk环境变量4. 验证sdk其他 0. 前言 本节记录如何配置eclipse的sdk配置 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;eclipse 1. 下载eclipse 来这边下载一下eclipse 菜鸟教程 完事之后打开eclips…

回归测试概念和4种回归测试策略——你想知道的都在这里啦!

前言&#xff1a; 回归测试是指修改了旧代码后&#xff0c;重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。自动回归测试将大幅降低系统测试、维护升级等阶段的成本。回归测试作为软件生命周期的一个组成部分&#xff0c;在整个软件测试过程中占有很大的工作…

Tomcat源码:Acceptor与Poller、PollerEvent

参考资料&#xff1a; 《Tomcat源码解析系列&#xff08;十一&#xff09;ProtocolHandler》 《Tomcat源码解析系列&#xff08;十二&#xff09;NioEndpoint》 前文&#xff1a; 《Tomcat源码&#xff1a;启动类Bootstrap与Catalina的加载》 《Tomcat源码&#xff1a;容器…

绝对不能错过的7个零基础免费的ChatGPT镜像网站

还在为打不开openai官网烦心&#xff1f;本文帮你实现ChatGPTMidJourney自由(&#xffe3;∇&#xffe3;)/ &#x1f4d2;收集了一些截至目前(2023年5月25日午12:00)可以免费访问&#xff0c;并且零基础也能正常使用的镜像网站&#xff0c;后续将持续维护更新(&#xff61;&a…

(2)lordPE脱壳

1.寻找OEP 1.1第一种情况 1.修改OD选项&#xff0c;调试设置"事件"为系统断点&#xff0c;直接打开"查看"->"内存",设置00400000下F2断点&#xff0c;单步F8找到0040****开头的OEP例如&#xff1a;00401528 1.2第二种情况 进入od后如果直…

Github疯传!200本经典计算机书籍!

好书在精不在多&#xff0c;每一本经典书籍都值得反复翻阅&#xff0c;温故而知新&#xff01; 下面分享几本计算机经典书籍&#xff0c;都是我自己看过的。 重构 改善既有代码的设计 就像豆瓣评论所说的&#xff0c;看后有种醍醐灌顶、欲罢不能的感觉。无论你是初学者&#…

数据结构与算法02:数组和链表

目录 【数组】 为什么Go语言的切片是成倍扩容&#xff1f; 【链表】 单链表 循环链表 双向链表 双向循环链表 数组和链表如何选择&#xff1f; 如何使用链表实现 LRU 缓存淘汰算法&#xff1f; 链表的一些操作 【每日一练】 【数组】 数组&#xff08;Array&#…

JMeter参数化四种实现方式

1 参数化释义 什么是参数化&#xff1f;从字面上去理解的话&#xff0c;就是事先准备好数据&#xff08;广义上来说&#xff0c;可以是具体的数据值&#xff0c;也可以是数据生成规则&#xff09;&#xff0c;而非在脚本中写死&#xff0c;脚本执行时从准备好的数据中取值。 参…

Sentinel热点key

1.基本介绍 官方文档 何为热点&#xff1f;热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据&#xff0c;并对其访问进行限制。比如&#xff1a; 商品 ID 为参数&#xff0c;统计一段时间内最常购买的商品 ID 并进行限制用户 ID 为参数&…

HyDE、UDAPDR(LLM大模型用于信息检索)

本篇博文继续整理LLM在搜索推荐领域的应用&#xff0c;往期文章请往博主主页查看更多。 Precise Zero-Shot Dense Retrieval without Relevance Labels 这篇文章主要做zero-shot场景下的稠密检索&#xff0c;通过借助LLM的力量不需要Relevance Labels&#xff0c;开箱即用。作…