力扣例题(用栈实现队列)

目录

链接. - 力扣(LeetCode)

描述

思路

push

pop

peek

empty

代码


链接
. - 力扣(LeetCode)

描述

思路

push

例如我们将10个元素放入栈中,假设最左边为栈顶,最右侧为栈底

则为10,9,8,7,6,5,4,3,2,1

pop

从队列的开头移除并返回元素,队列的开头为最右侧的1

我们先将前面的元素放入空栈中

空栈中元素顺序为2,3,4,5,6,7,8,9,10

我们发现元素顺序反了,说明等下要反转回来

此时原栈中只剩最后一个元素1,我们将1拷贝下来并踢出去即可

此时原栈成为空栈,我们将元素全部放回去即可,原栈顺序改为10,9,8,7,6,5,4,3,2

通过反转我们就顺利的将队列中的第一个元素1给删除了

peek

返回队列开头元素与pop思路基本一致,唯一的不同点为原栈中不需要再将元素1删去,拷贝后直接将元素全部取回来即可。

empty

两个栈均不为空指针即可

代码

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) {
	ps->_a = NULL;
	ps->_capacity = 0;
	ps->_top = -1;
}
void StackPush(Stack* ps, STDataType data) {
	if (ps->_capacity == ps->_top + 1) {
		int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
		STDataType* tmp = (STDataType*)realloc(ps->_a, newcapacity * sizeof(STDataType));
		if (tmp == NULL) {
			perror("realloc error");
			return;
		}
		ps->_a = tmp;
		ps->_capacity = newcapacity;
	}
	ps->_top++;
	ps->_a[ps->_top] = data;
}
void StackPop(Stack* ps) {
	if (ps->_top == -1) {
		return;
	}
	ps->_top--;
}
STDataType StackTop(Stack* ps) {
	return ps->_a[ps->_top];
}
int StackSize(Stack* ps) {
	return ps->_top + 1;
}
int StackEmpty(Stack* ps) {
	if (ps->_top == -1)
		return 1;
	return 0;
}
void StackDestroy(Stack* ps) {
	ps->_capacity = 0;
	ps->_top = -1;
	free(ps->_a);
	ps->_a = NULL;
}
typedef struct {
	Stack s1;
	Stack s2;
} MyQueue;


MyQueue* myQueueCreate() {
	MyQueue* mn = (MyQueue*)malloc(sizeof(MyQueue));
	StackInit(&(mn->s1));
	StackInit(&(mn->s2));
	return mn;
}

void myQueuePush(MyQueue* obj, int x) {
	Stack* nonempty = &(obj->s1), * empty = &(obj->s2);
	if (StackEmpty(nonempty)) {
		nonempty = &(obj->s2);
		empty = &(obj->s1);
	}
	StackPush(nonempty, x);
}

int myQueuePop(MyQueue* obj) {
	Stack* nonempty = &(obj->s1), * empty = &(obj->s2);
	int a;
	if (StackEmpty(nonempty)) {
		nonempty = &(obj->s2);
		empty = &(obj->s1);
	}
	while (StackSize(nonempty) != 1) {
		StackPush(empty, StackTop(nonempty));
		StackPop(nonempty);
	}
	a = StackTop(nonempty);
	StackPop(nonempty);
	while (StackSize(empty) != 0) {
		StackPush(nonempty, StackTop(empty));
		StackPop(empty);
	}
	return a;
}

int myQueuePeek(MyQueue* obj) {
	Stack* nonempty = &(obj->s1), * empty = &(obj->s2);
	if (StackEmpty(nonempty)) {
		nonempty = &(obj->s2);
		empty = &(obj->s1);
	}
	while (StackSize(nonempty) != 1) {
		StackPush(empty, StackTop(nonempty));
		StackPop(nonempty);
	}
	int a = StackTop(nonempty);
	while (StackSize(empty) != 0) {
		StackPush(nonempty, StackTop(empty));
		StackPop(empty);
	}
	return a;
}

bool myQueueEmpty(MyQueue* obj) {
	if (StackEmpty(&(obj->s2)) && StackEmpty(&(obj->s1)))
		return true;
	return false;
}

void myQueueFree(MyQueue* obj) {
	StackDestroy(&(obj->s1));
	StackDestroy(&(obj->s2));
	free(obj);
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows使用Docker-Desktop部署lobe-chat

文章目录 window安装docker-desktop下载和启动lobe-chatAI大语言模型的选择lobe-chat设置大模型连接 window安装docker-desktop docker-desktop下载地址 正常安装应用,然后启动应用,注意启动docker引擎 打开右上角的设置,进入Docker Engine设…

ZFS 文件系统结构及 ZFS 文件系统数据恢复

ZFS是一种革命性的文件系统,它遵循完全不同的文件系统管理方法,同时提供目前其他文件系统无法提供的新功能和优势。ZFS 可靠、可扩展且易于管理。 它放弃了卷的概念,从而摆脱了传统的文件系统原则。另外,ZFS 提供更复杂的存储池&…

torch_geometric安装(CPU版本)

①打开官方安装网址:https://pytorch-geometric.readthedocs.io/en/2.3.0/install/installation.html ②对根据Pytorch选择相应版本。此前一直用CUDA不成功,这次使用CPU版本(因为不用对应cuda,pytorchcudageometric三者对应起来很…

线下线上陪玩APP小程序H5搭建设计-源码交付,支持二开!

一、电竞陪玩系统APP的概念 电竞陪玩系统APP是一种专门为电子竞技玩家提供服务的平台。通过这个平台,玩家可以找到专业的电竞陪玩者,他们可以帮助玩家提升游戏技能,提供游戏策略建议,甚至陪伴玩家一起进行游戏。这种服务不仅可以提…

医疗图像处理2023年CVPR:Label-Free Liver Tumor Segmentation-无标签肝肿瘤分割

目录 一、摘要 二、介绍 三、相关工作 四、网络框架 1.位置选择 2.纹理处理 3.形状生成 4.后处理 5.参数设计 五、实验 1.数据集: 2.评价指标: 3.实现: 4.结果: 六、结论 一、摘要 通过在CT扫描中使用合成肿瘤&am…

分布式存储故障导致数据库无法启动故障处理---惜分飞

国内xx医院使用了国外医疗行业龙头的pacs系统,由于是一个历史库,存放在分布式存储中,由于存储同时多个节点故障,导致数据库多个文件异常,数据库无法启动,三方维护人员尝试通通过rman归档进行应用日志,结果发现日志有损坏报ORA-00354 ORA-00353,无法记录恢复,希望我们给予支持 M…

队列的相关操作:用队列实现栈

1.思路解析 由于C语言封装度不是很高,不像C可以直接用现成的,所以我们要自己做一个“轮子”,即自己实现一个队列,这里直接放出代码,详解可以移步到我的另一篇关于队列的博客,点我移步,原题来源于…

Mp3tag for Mac:音乐标签,轻松管理

还在为杂乱无章的音乐文件而烦恼吗?Mp3tag for Mac,让您的音乐库焕然一新!它支持多种音频格式,批量编辑标签,让音乐管理变得简单高效。同时,自动获取在线数据库的音乐元数据,确保您的音乐库始终…

并发-判断线程对象是否处于活动状态 - isAlive

t.isAlive() 测试线程t是否处于活动状态,只要线程启动并且没有终止,方法返回值就是truestart()之前,线程不处于活动状态,之后就处于活动状态示例:运行结果:但是事情并没有这么简单,先来看一下以…

面试经典算法系列之数组/字符串5 -- 反转字符串中的单词

面试经典算法题37-反转字符串中的单词 LeetCode.151 公众号:阿Q技术站 问题描述 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词…

【JavaEE 初阶(五)】文件操作和IO

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵关注我带你了解更多文件操作 目录 1.前言2.认识文件3.文件操作3.1File 属性3.2构造方法3.3File类方法 4.文件内容操作4.1R…

栈和队列的相互实现

1. 两个队列实现栈. - 力扣(LeetCode) 队列的特点是先进先出,而栈的特点是后进先出(先进后出),也就是说重点在于利用两个队列来改变“出”的顺序。 假设我们在进行入栈操作的时候将数据依次入到一个队列中…

国产操作系统下Chrome的命令行使用 _ 统信 _ 麒麟

原文链接:国产操作系统下Chrome的命令行使用 | 统信 | 麒麟 Hello,大家好啊!今天我们来聊聊如何在国产操作系统上使用命令行操作Google Chrome。无论是进行自动化测试、网页截图还是网页数据抓取,使用命令行操作Google Chrome都能…

LVS的三种工作模式---(DR/TUN/NAT)

目录 一、NAT模式(LVS-NAT) 二、IP隧道模式(LVS-TUN) 三、DR模型--直接路由模式(LVS-DR) LVS/DR模式ARP抑制 原因: LVS的DR工作模式及配置: LVS的NAT工作模式及配置&#xff1…

Python游戏制作大师,Pygame库的深度探索与实践

写在前言 hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。 希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的&#x…

ppt图片居中对齐

今天简单尝试了一下ppt图片怎么居中对齐,记录如下 准备一张图片 可以把位置该成居中 就可以让图形居中了

完全背包问题(c++)

完全背包问题 当前有 N 种物品,第 i 种物品的体积是 ci​,价值是 wi​。 每种物品的数量都是无限的,可以选择任意数量放入背包。 现有容量为 V 的背包,请你放入若干物品,使总体积不超过 V,并且总价值尽可…

7. path路径绘制:使用path绘制曲线

曲线在SVG中通常是通过贝塞尔曲线命令来绘制的,包括二次贝塞尔曲线(Q)和三次贝塞尔曲线(C)。这些命令允许我们创建平滑的曲线路径。 贝塞尔曲线的原理 贝塞尔曲线的基本原理是通过控制点和锚点来定义一条曲线的形状。…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中,Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作,以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系:用户在View上进行操作&…

数据结构复习指导之树、森林

文章目录 树、森林 考纲内容 复习提示 1.树的存储结构 1.1双亲表示法 1.2孩子表示法 1.3孩子兄弟表示法 2.树、森林、与二叉树的转换 2.1树转换为二叉树 2.2森林转换为二叉树 2.3二叉树转换为森林 3.树和森林的遍历 3.1树的遍历 3.2森林的遍历 树、森林 考纲内容…