用两个栈来实现队列

news2024/11/30 6:54:55

在这里插入图片描述

typedef int SltDatatype;
typedef struct Stack
{
	SltDatatype* a;//开辟栈的动态内存空间
	int top;//记录栈顶
	int capacity;//记录容量
}ST;

void STInit(ST* ps);//栈的初始化
void STDestroy(ST* ps);//释放
void STPush(ST* ps, SltDatatype x);//入栈
void STPop(ST* ps);//出栈
SltDatatype STTop(ps);//获取栈顶原数
int Size(ps);//求栈的长度
bool STEmpty(ST* ps);//空



void STInit(ST* ps)
{
	assert(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}

void STPush(ST* ps,SltDatatype x)//入栈
{
	assert(ps);
	
	if (ps->top == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//因为初始化是capacity是0,所有这里需要,如果capacity是0的话,*2也是0,所有要在这里先给他一个值4
		//扩容
		SltDatatype * tmp= (SltDatatype*)realloc(ps->a, sizeof(SltDatatype) * newcapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		ps -> a = tmp;
		ps->capacity = newcapacity;

	}
	ps->a[ps->top] = x;
	ps->top++;
}

void STDestroy(ST* ps)//释放
{
	assert(ps);
	free(ps->a);
	ps->a = NULL;
	ps->capacity = 0;
	ps->top = 0;
}
void STPop(ST* ps)//出栈
{
	assert(ps);
	assert(ps->top>0);//空
	ps->top--;

}



SltDatatype STTop(ST* ps)//获取栈顶原数
{

	assert(ps);
	assert(ps->top > 0);

	return ps->a[ps->top - 1];
}

int Size(ST* ps)//求栈的长度
{
	assert(ps);
	return ps->top;

}

bool STEmpty(ST* ps)//空
{
	assert(ps);
	return ps->top == 0;
}


//把两个栈包含在一个结构体中,然后通过这个结构体去操作两个栈,进而实现队列的功能
typedef struct {
    ST pushst;
    ST popst;

} MyQueue;


MyQueue* myQueueCreate() {//为结构体开辟一个指针,方便之后的访问操作
    MyQueue*obj=(MyQueue*)malloc(sizeof(MyQueue));
     STInit(&obj->pushst);//初始化两个栈
     STInit(&obj->popst);

		 return obj;
}

void myQueuePush(MyQueue* obj, int x) {//入队:就相当于往第一一个栈中压入数据
    STPush(&obj->pushst,x);

}



int myQueuePeek(MyQueue* obj) {//返回队列的头元素,就相当于返回第二个栈的栈顶元素
     if(STEmpty(&obj->popst))//如果第二个栈空了,那么就要在从第一个里面捣过来
    {
        while(!STEmpty(&obj->pushst))
        {
        STPush(&obj->popst,STTop(&obj->pushst));//因为是栈,所以每捣一次都是捣的栈顶元素
        STPop(&obj->pushst);//并且既然捣过去了,那就要把第一个里面的删了;
        }
    }
    return STTop(&obj->popst);

}

int myQueuePop(MyQueue* obj) {
   int val= myQueuePeek(obj);//保存队列的头元素
        STPop(&obj->popst);//从队列的开头移除这个元素:就相当于删除第二个栈的栈顶元素
        return val;

   
}

bool myQueueEmpty(MyQueue* obj) {
    return STEmpty(&obj->popst)&&STEmpty(&obj->pushst);//两个栈都是空,那么模拟出来的队列就是空
}

void myQueueFree(MyQueue* obj) {
    STDestroy(&obj->popst);//先释放两个栈
    STDestroy(&obj->pushst);
    free(obj);//再释放储存两个栈变量的结构体空间
}

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

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

相关文章

喝健康白酒 有益生心健康

中国的制酒史源远流长,酒渗透在中华五千年的文化中。酒与烟不同,烟对人体有百害而无一利,而对于酒,若掌握好饮酒的度,对人体有一定的养生作用,所以我们通常会说“戒烟限酒”。 据一些专家研究,…

下载盗版网站视频并将.ts视频文件合并

. 1.分析视频请求123 2.数据获取和拼接 1.分析视频请求 1 通过抓包观察我们发现视频是由.ts文件拼接成的每一个.ts文件代表一小段2 通过观察0.ts和1.ts的url我们发现他们只有最后一段不同我们网上找到url获取的包3 我们发现index.m3u8中储存着所有的.ts文件名在拼接上前面固定…

重置Jetson设备的Ubuntu密码:通过挂载根目录到另一个Linux系统

在本文中,我们将介绍如何在忘记Ubuntu 20.04密码的情况下重置密码。我们将通过将Ubuntu的根目录挂载到另一个Linux系统来实现这一目的。我们还将介绍chroot命令的功能。 1. 背景 最近,我们研发团队遇到了一个棘手的问题。一台用于研发,多人使…

验证曲线(validation_curve)项目实战

验证曲线 validation_curve 一、简介 validation_curve验证曲线,可确定不同参数值下的训练和测试分数 根据指定参数的不同值计算估计器的得分 这与使用一个参数的网格搜索类似。不过,这也会计算训练得分,只是一个用于绘制结果的工具。 二、…

十个有用的 Vue.js 自定义 Hook

Vue.js 是我使用的第一个 JavaScript 框架。 我可以说 Vue.js 是我进入 JavaScript 世界的第一扇门之一。 目前,Vue.js 仍然是一个很棒的框架。 我认为有了组合 API,Vue.js 只会增长得更多。 在本文中,我将向分享 10 个可以使用 Vue.js 制作…

计算机竞赛 深度学习手势识别 - yolo python opencv cnn 机器视觉

文章目录 0 前言1 课题背景2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存 5 模型训练5.1 修…

竞赛 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …

【笔试强训day01】组队竞赛 删除公共字符

​👻内容专栏: 笔试强训集锦 🐨本文概括:C笔试面试常考题之笔试强训day01。 🐼本文作者: 阿四啊 🐸发布时间:2023.10.1 一、day01 1.组队竞赛 题目描述 题目描述:牛牛举…

【JavaEE】JavaScript

JavaScript 文章目录 JavaScript组成书写方式行内式内嵌式外部式(推荐写法) 输入输出变量创建动态类型基本数据类型数字类型特殊数字值 String转义字符求长度字符串拼接布尔类型undefined未定义数据类型null 运算符条件语句if语句三元表达式switch 循环语…

【算法|贪心算法系列No.3】leetcode334. 递增的三元子序列

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望…

[C++_containers]10分钟让你掌握vector

前言 在一个容器的创建或是使用之前,我们应该先明白这个容器的一些特征。 我们可以通过文档来来了解,当然我也会将重要的部分写在下面。 1. vector 是表示可变大小数组的序列容器。 2. 就像数组一样, vector 也采用的连续存储空间来存储元…

picoctf_2018_shellcode

picoctf_2018_shellcode Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX disabled PIE: No PIE (0x8048000) RWX: Has RWX segments32位,啥都没开 这个看着挺大的,直接来个ROPchain,…

Mapfree智驾方案,怎样实现成本可控?

整理|睿思 编辑|祥威 编者注:本文是HiEV出品的系列直播「智驾地图之变」第二期问答环节内容整理。 元戎启行副总裁刘轩与连线嘉宾奥维咨询董事合伙人张君毅、北汽研究总院智能网联中心专业总师林大洋、主持嘉宾周琳展开深度交流,并进行了答疑。 本期元…

新手--安装好Quartus II13.0(带modelsim集成包)并用Quartus II搭建一个工程

前言 今天是国庆节,我们正式来学习Quartus II13.0软件的安装与使用。学习verilog与学习C语言都是学习一门语言,那么学习一门语言,光看理论不敲代码绝对是学习不好的。要用verilog语言敲代码,就要像C语言那样搭建起语言的编译环境&…

USART串口协议

通信接口 •通信的目的:将一个设备的数据传送到另一个设备,扩展硬件系统 • 通信协议:制定通信的规则,通信双方按照协议规则进行数据收发 全双工:指通信双方能够同时进行双向通信,一般来说,全双…

扩容领跑者 Arbitrum 抢占 Layer3 竞争高地

近段时间以来,Arbitrum 凭借创新技术和优越生态系统逐渐成为顶尖的以太坊扩容解决方案。当新一轮 Layer3 竞争在 Rollup 领域展开时,Arbitrum 和 Optimism 始终是备受瞩目的两大角色。Optimism 以独特的 OP Stack 进行水平扩展,而 Arbitrum 则…

K-Means(下):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

shell脚本使用(宿主机windows-服务器-centos)--用于使用shell脚本方式控制docker容器

需求: 我想要使得windows上编写shell脚本,并且在这个shell脚本在linux中也可用 shell脚本在windows上无法直接运行,但是有WSL这个linux子系统的工具 可以使得shell脚本在主机上执行 视频讲解连接 https://www.bilibili.com/video/BV1Tw411Y7FP/方式1 …

Object.defineProperty()方法详解,了解vue2的数据代理

假期第一篇,对于基础的知识点,我感觉自己还是很薄弱的。 趁着假期,再去复习一遍 Object.defineProperty(),对于这个方法,更多的还是停留在面试的时候,面试官问你vue2和vue3区别的时候,不免要提一提这个方法…

【VIM】VIm-plug插件

如何查找需要的插件 https://github.com/mhinz/vim-startify https://github.com/vim-airline/vim-airline https://github.com/Yggdroot/indentLine github.com/w0ng/vim-hybrid github.com/altercationi/vim-colors-solarized guithub.com/morhetz/gruvbox github.com/sc…