【初阶数据结构题目】17.用栈实现队列

news2024/9/22 19:38:49

用栈实现队列

点击链接答题

思路:

定义两个栈:pushST(入数据)和popST(出数据)

假设我们要在队列里放123,出队列123

我们先在pushST里面放进去1 2 3

然后把pushST里面的数据拿到popST里面,依次是3 2 1

然后把1提取出来,把2提取出来,把3提取出来.


如果我们先在pushST里面放进去1 2 3

然后把pushST里面的数据拿到popST里面,依次是3 2 1

然后在pushST里面放进去4

然后把popST里面的1提取出来,把2提取出来,把3提取出来.

然后把pushST里面的数据4拿到popST里面

然后把4提取出来


入队:往pushST中插入数据

出队:判断popST是否为空,不为空直接pop,为空的话将pushST导入到popST中再pop

取队头:跟出队一样,但这里只取数据,不pop数据

代码:

//定义栈的结构
typedef char STDataType;
typedef struct Stack {
	STDataType* arr;
	int capacity;//栈的空间大小
	int top;//栈顶
}ST;

//栈的初始化
void STInit(ST* ps) {
	assert(ps);
	ps->arr = NULL;
	ps->capacity = ps->top = 0;
}

//栈的销毁
void STDestory(ST* ps) {
	assert(ps);
	if (ps->arr) {
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->top = ps->capacity = 0;
}

//栈顶---入数据,出数据
//入数据
void StackPush(ST* ps, STDataType x) {
	assert(ps);
	//1.判断空间是否足够
	if (ps->capacity == ps->top) {
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//增容
		STDataType* tmp = (STDataType*)realloc(ps->arr, newCapacity * sizeof(STDataType));
		if (tmp == NULL) {
			perror("relloc fail!");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = newCapacity;
	}
	//空间足够
	ps->arr[ps->top++] = x;
}

//判断栈是否为空
bool StackEmpty(ST* ps) {
	assert(ps);
	return ps->top == 0;
}

//出数据
void StackPop(ST* ps) {
	assert(ps);
	assert(!StackEmpty(ps));//栈为空报错
	--ps->top;
}

//获取栈中有效元素个数
int STSize(ST* ps){
	assert(ps);
	return ps->top;
}

//取栈顶元素
STDataType StackTop(ST* ps) {
	assert(ps);
	assert(!StackEmpty(ps));

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



//
typedef struct {
    ST pushST;
    ST popST;
} MyQueue;

//队列的初始化
MyQueue* myQueueCreate() {
    MyQueue* pst = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&pst->pushST);
    STInit(&pst->popST);

    return pst;
}

//往pushST中插入数据
void myQueuePush(MyQueue* obj, int x) {
    StackPush(&obj->pushST,x);
}

//删除数据
//1.检查popST是否为空,不为空直接出,为空pushST导入到popST,再出数据
int myQueuePop(MyQueue* obj) {
    if(StackEmpty(&obj->popST)){
        //如果popST为空
        //导数据
        while(!StackEmpty(&obj->pushST)){
            //如果pushST非空
            StackPush(&obj->popST, StackTop(&obj->pushST));//把取到的栈顶元素导入进popST
            StackPop(&obj->pushST);
        }
    }
    //取栈顶,删除栈顶元素并返回栈顶数据
    int top = StackTop(&obj->popST);//储存删除的栈顶元素
    StackPop(&obj->popST);
    return top;//返回删除的栈顶元素
}

//取队头元素
int myQueuePeek(MyQueue* obj) {
    if(StackEmpty(&obj->popST)){
        //如果popST为空
        //导数据
        while(!StackEmpty(&obj->pushST)){
            //如果pushST非空
            StackPush(&obj->popST, StackTop(&obj->pushST));//把取到的栈顶元素导入进pushST
            StackPop(&obj->pushST);
        }
    }
    //取栈顶,删除栈顶元素并返回栈顶数据
    return StackTop(&obj->popST);//返回删除的栈顶元素
    
}

//判断队列是否为空
bool myQueueEmpty(MyQueue* obj) {
    return StackEmpty(&obj->pushST) && StackEmpty(&obj->popST);
}

//队列的销毁
//就是两个栈的销毁
void myQueueFree(MyQueue* obj) {
    STDestory(&obj->pushST);
    STDestory(&obj->popST);
    free(obj);
    obj = NULL;
}

/**
 * Your MyQueue struct will be instantiated and called as such:
 * MyQueue* obj = myQueueCreate();
 * myQueuePush(obj, x);
 
 * int param_2 = myQueuePop(obj);
 
 * int param_3 = myQueuePeek(obj);
 
 * bool param_4 = myQueueEmpty(obj);
 
 * myQueueFree(obj);
*/

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

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

相关文章

会务要闻|向绿提质:上市企业ESG评级提升

在全球市场对环境、社会和治理(ESG)指标的关注与日俱增的大背景下,中国正积极拥抱ESG理念,将其作为推动经济与社会全面绿色转型的催化剂,更被企业视为长期主义投资策略的基石。面对日益严格的国际ESG尽职调查要求&…

信息论在机器学习中的实际应用

目录 一、说明 二、什么是信息论? 2.1 信息论中的关键概念 2.2 熵与信息 2.3 相互信息 2.4 Kullback-Leibler 背离 三、信息论在机器学习中的应用 3.1 功能选择: 3.2 计算边际概率分布 3.3 决策树:Information 增益 3.4 评估具有 KL 背…

FastAPI+Vue3工程项目管理系统项目实战私教课 上课笔记20240808 课程和学习计划制定

学习目标 将Word和Excel做的东西放到数据库里面去工程类公司,甲方,劳务存到数据库存储的信息主要是人员的信息 基本信息: 人员信息,资料库,甲方的人出现在哪些项目上,考勤材料信息,进货记录&…

yolov5更换主干网络shufflent

目录 1.网络结构解析 1.1创建yolov5s_shufflent_v2_X0_5.yaml文件 2.对common.py末尾进行添加 3.修改yolo.py 1.网络结构解析 1.可以先看看shufflenet_v2的网络结构 import torch from torch import nn from torchvision import models from torchinfo import summaryclas…

利用vscode-icons-js在Vue3项目中实现文件图标展示

背景: 在开发文件管理系统或类似的项目时,我们常常需要根据文件类型展示对应的文件图标,这样可以提高用户体验。本文将介绍如何在Vue3项目中利用vscode-icons-js库,实现类似VSCode的文件图标展示效果。 先看效果: 一…

Flink任务提交流程和运行模式

任务提交流程 Flink 的提交流程随着部署模式、资源管理平台的不同,会有不同的变化。这里做进一步的抽象,形成一个大概高视角的任务执行流程图,如下: Flink按照集群和资源管理的划分运行模式有:Standalone、Flink On…

你是否陷入了惯性思维的陷阱?

如何突破惯性思维? 文 / 周妙錥(MEOW EE CHEW)13-02-2024 什么是惯性思维? 惯性思维(Inertial Thinking)是指我们在面对问题、决策或行为选择时,倾向于依赖过去的经验、习惯或想法&#xff0…

SubtitleEdit:一个基于.Net开发的开源字幕编辑器

现在是短视频的时代,对视频的字幕编辑需求非常多,今天介绍一个功能强大的开源视频字幕编辑器。 01 项目简介 Subtitle Edit 是基于.Net开发的开源项目,支持跨平台使用,包括Windows、Linux 和 macOS。这个软件不仅支持多种字幕格…

打开 Mac 触控板的三指拖移功能

对于支持力度触控的触控板,可以选择使用三指手势来拖移项目。 相应的设置名称会因你使用的 macOS 版本而有所不同: 选取苹果菜单  >“系统设置”(或“系统偏好设置”)。 点按“辅助功能”。 点按“指针控制”(…

cms框架cookice注入漏洞

目录 一、环境 二、开始分析 2.1代码审计(未授权访问) 一、环境 环境私聊获取 二、开始分析 2.1代码审计(未授权访问) 我们可以看到构造函数ip是通过X_FORWARDED_FOR来获取的,而这个刚好可以伪造,那我…

理解张量拼接(torch.cat)

拼接 维度顺序:对于 3D 张量,通常可以理解为 (深度, 行, 列) 或 (批次, 行, 列)。 选择一个dim进行拼接的时候其他两个维度大小要相等 对于三维张量,理解 torch.cat 的 dim 参数确实变得更加抽象,但原理是相同的。让我们通过一…

【ow365】java对接使用第三方ow365预览pdf,word等office文档

ow365官网 文档在线预览 OfficeWeb365 速度更快的Office在线预览服务提供office在线预览及PDF在线预览服务,支持Word文档在线预览、Excel在线预览、PowerPoint在线预览、WPS等Office文件在线预览,支持所有浏览器及移动设备Mobile预览,无需安…

一款免费开源快速启动工具,提高工作效率!

这是一款可以帮助我们快速启动windows电脑上的程序的工具,可以添加分组,设置网站,程序,系统工具快速一键打开,让桌面变的更简洁,打开程序更方便。小编提醒,直接拖动程序快捷方式到程序框内&…

游戏直播、教学录制两不误:2024年Win适用录屏软件推荐

回顾一下你是去线下看活动的次数多还是在线上参与活动的次数多。线下活动的时候我们一般是举着相机或者手机进行录制,那线上呢?只要找到适合win10录屏的工具你线上活动记录起来就更方便了。 1.FOXIT录屏大师 链接直达:https://www.foxitsof…

隐藏WindTerm左边的时间戳

文章目录 1、快捷键操作隐藏时间戳2、鼠标方式操作隐藏 1、快捷键操作隐藏时间戳 按住 alt 键不动,连续按 t 两下 即可隐藏时间戳 2、鼠标方式操作隐藏 取消勾选时间戳即可隐藏时间戳

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测+交叉验证

NRBO-XGBoost分类 基于牛顿-拉夫逊优化算法[24年最新算法]-XGBoost多特征分类预测交叉验证 多输入单输出) matlab代码 程序已调试好,无需更改代码替换数据直接使用!!!数据格式为excel格式!需要定制可私&a…

CTF — 图像隐写三板斧

这几天做CTF比赛相关的题目,每天总结一篇与大家分享,本人对CTF也算是个初学者,通过一些学习感觉收获还是很多的。学会了一些工具软件的使用和相关知识的原理。今天继续分享图片隐写,图像隐写类题目的特点:考法多样,思路清奇,工具众多。先分享“第一板斧”的解题套路。 …

Spark轨迹大数据高效处理_计算两经纬度点间的距离_使用Haversine formula公式

开发背景 接上文我求的两经纬度点之间的方位角,我的需求里还提到了要计算距离,当然这个距离也是为后面的需求做铺垫的,因此需要求两个经纬度电之间的距离。 不要妄想用勾股定理求出来,实际上距离的计算还是稍微复杂些。这里使用的…

关于Libarary loader转化成16.6的使用方法

关于Libarary loader转化成16.6的使用方法 直接去贸泽下载程序,免费使用的 2.开始安装 出现图标 3.桌面新建文件夹作为文件生成路径 4.下载ECAD模型的文件 5.打开Library loader 6.这玩意需要搞个邮箱注册,可以用QQ邮箱随便注册一个 7.将下载的文件放…

VBA 指定快捷键在Excel中粘贴指定缩放图片

1. 应用背景 做测试的时候需要在Excel文件中贴图,但是直接粘贴的话图片又太大,需要手动调整,这时就可以利用这个宏来实现一次性粘贴并调整好图片的大小。 2. 宏的制作 可以是.xlsm文件,将该文件放到[C:\Program Files\Microsof…