数据结构——用栈实现队列

达妙电机MIT模式调参实战:如何从‘曲线偏离’到‘完美追踪’正弦波? 本文详细解析了达妙电机MIT模式调参实战,从曲线偏离到完美追踪正弦波的方法论。通过MATLAB实时曲线分析,深入探讨位置环(kp)和速度环(kd)的双重调节技巧,帮助工程师优化参数组合,提升电机控制精度和稳定性。 阅读详情


介绍

题目来源

题目来源于力扣网站:用栈实现队列
题目


原理讲解

根据要求,只能使用标准的栈操作实现队列,关于标准的栈操作可以看我写过的文章:数据结构——栈

我们知道,栈是先进后出,而队列是先进先出,所以毫无疑问,仅用一个栈没办法实现队列

进一步考虑,栈的出入顺序是相反的,所以如果将出栈顺序逆序,就实现了先进先出,因此可以使用两个栈来达到这个效果
结构示意图
上图用栈操作来讲解就是,队列尾插,相当于对pushst入栈,然后将pushst出栈同时对popst入栈,当队列头删时,相当于popst出栈

以上是基本原理,接下来我们用代码实现这个队列


代码实现

栈的基本操作如下

typedef int STDataType;
typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;

//初始化和销毁
void STInit(ST* pst);
void STDestroy(ST* pst);

//入栈 出栈
void STPush(ST* pst, STDataType x);
void STPop(ST* pst);

//取栈顶
STDataType STTop(ST* pst);

//判空
bool STEmpty(ST* pst);

//获取数据个数
int STSize(ST* pst);

队列结构

//MyQueue
typedef struct {
    ST pushst;
    ST popst;
} MyQueue;

初始化

 
初始化一个队列,返回队列的指针
1.申请空间
2.将队列里两个栈初始化
3.返回队列的指针

MyQueue* myQueueCreate() {
    MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));
    STInit(&(obj->pushst));
    STInit(&(obj->popst));
    return obj;
}

销毁

 
销毁队列占用的空间,传入队列的指针
1.销毁两个栈
2.释放队列指针

void myQueueFree(MyQueue* obj) {
    STDestroy(&(obj->pushst));
    STDestroy(&(obj->popst));
    free(obj);
}

尾插

 
尾插新数据,传入队列指针和新数据x
根据前文中讲的原理,对队列尾插相当于对pushst入栈,因此直接调用入栈函数即可

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

头删

 
队列头删,传队列指针,返回队头元素
根据上述原理,队列头删相当于popst出栈
popst的顶端元素就是队列的队头元素,根据题目要求,头删时返回队头元素
因此首先判断popst是否为空
如果popst为空,就将pushst里的所有数据先出栈,再入栈到popst
接下来用ret接收popst的顶端元素,再对popst执行出栈
最后返回ret

int myQueuePop(MyQueue* obj) {
	//栈判空
    if(STEmpty(&(obj->popst)))
    {	
    	//将数据从pushst出栈,同时入栈到popst
        while(!STEmpty(&(obj->pushst)))
        {
            STPush(&(obj->popst),STTop(&(obj->pushst)));
            STPop(&(obj->pushst));
        }
    }
    //接收队头数据
    int ret = STTop(&(obj->popst));
    STPop(&(obj->popst));
    return ret;
}

返回队头数据

 
获取队头元素,传入队列指针
这个函数来源于上面头删函数,但是不需要对popst出栈

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));
}

判空

 
判断队列是否为空,返回bool值
当队列中两个栈都为空时,队列就是空,因此用逻辑与对两个栈判空即可

bool myQueueEmpty(MyQueue* obj) {
    if(STEmpty(&(obj->pushst)) && STEmpty(&(obj->popst)))
    {
        return true;
    }
    return false;
}

总结

问题的突破关键在于,栈遵守先进后出的原则,队列遵守先进先出的原则,栈可以逆序数据,两个栈就是两次逆序,两次逆序后顺序不变,从而实现了队列的原则

在尾插时对pushst入栈,在头删时对popst出栈,两个栈互不干扰
只有当popst为空时,才需要将pushst的数据压入popst

最后这是代码的通过截图
通过截图

如果你有更高性能的实现方式,欢迎在评论区探讨

以上是用栈实现队列的全部讲解
如果存在错误,欢迎指正
富斯遥控器-ros机器人控制 富斯遥控器-ros机器人手柄控制 阅读详情

相关推荐

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 755

用栈实现队列

总体思路:开出两个栈,先将数据按照次序放入其中一个栈中,而另外一个栈什么都不放,处于置空状态。返回队列开头的元素,首先要实现队列嘛,我们已经实现,拿来用就行,而出栈的元素即为开头元素,直接返回出栈的元素不就可以。栈是一种特殊的线性表,只允许在固定的一端进行插入删除元素操作,进行数据插入,删除的一端叫做栈顶,另一端叫做栈底。接着把栈popST出栈,出栈顺序为1,2,3,这会儿栈已经实现了队列。而队列具有先进先出特征。栈,队列看着没啥关系,如何用栈实现队列呢?有了栈,有了总体思路,那就可以开始干了。

skuen_18的博客 1403

基于Joplin和Joplin Server搭建私有云笔记

我们知道,多端同步功能是笔记工具最重要的功能。只有实现了多端同步,我们才能在工作电脑和手机之间无缝切换笔记体验。Joplin 在同步上做得不错,支持 Dropbox、OneDrive 和 AWS s3(当然国内都没法用),支持 WebDAV 协议,也支持自家的 Joplin Server。 本文介绍如何在自己的服务器上搭建 Joplin Server,并配置好 Joplin Desktop 的同步功能。 前置条件 安装docker 创建 Joplin Server 配置文件 创建配置文件,~/docke

代码时光 1万+

【数据结构】用栈实现队列

本篇总结利用栈如何实现队列的相关操作,不难观察,栈和队列是可以相互转化的,需要好好总结它们的特性,构造出一个恰当的结构来实现即可,所以本篇难点不在代码思维,而是对结构的理解。

Extreme_wei的博客 4351

从数据到特征:基于CAT12的MRI图像预处理实战指南

本文详细介绍了使用CAT12工具进行MRI图像预处理的完整实战流程。从数据获取、环境搭建到核心的AC-PC校正、组织分割、空间标准化与调制,逐步解析如何将原始脑影像数据转化为可用于机器学习的标准化特征图。重点阐述了预处理作为脑影像分析‘生命线’的重要性,并提供了避坑指南与自动化脚本建议,帮助研究者构建高质量的阿尔茨海默症分类模型输入特征。

weixin_29065959的博客 310

深度强化学习训练结果曲线绘制教程

使用python语言,只调用matplotlib库,绘制训练过程中保存的强化学习训练曲线。模仿经典论文中的训练曲线,多次训练取平均,并绘制出阴影区域。

加斯顿工程师的博客 911

【数据结构】如何用栈实现队列?图文解析(LeetCode)

注:本文默认读者已掌握栈与队列的基本操作。

在这个博客里,我会分享我的技术见解、项目经验和学习笔记,感谢各位支持~ 3327

针对小缺陷目标:在YOLOv11中引入小目标检测层

摘要: 针对YOLOv11在工业检测中漏检微小目标(如焊点气泡)的问题,研究发现深层特征下采样导致小目标信息丢失。通过在YOLOv11中增加P2检测层(4倍下采样)并融合浅层高分辨率特征,可显著提升小目标召回率。关键优化包括:调整模型结构、谨慎设计数据增强策略(减少MixUp、增加小目标粘贴)、重新分配损失权重(提升P2层权重)、优化推理速度(动态分辨率、通道裁剪)。同时强调数据质量的重要性,建议根据具体场景特性(目标尺寸、分布)定制方案,而非盲目调整模型。

as1225120794的博客 366

【数据结构】栈实现队列 & 队列实现栈

🏷️力扣地址:🌈232. 用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作 实现 类:示例1: 💫关键思路:1️⃣pop接口🌠动图解析:👇🏻2️⃣peek接口🌠动图解析:👇🏻3️⃣push接口🌠动图解析:👇🏻4️⃣empty接口💡代码实现: 🏷️力扣地址:🌈225. 用队列实现栈请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(、、 和 )。实现 类:示例1 🌍解题关键:💫关键思路:那到底是如何实......

qq_42996461的博客 1838

5.1 直流无刷电机(BLDC):基本控制概念

本文系统介绍了直流无刷电机(BLDC)控制系统的核心概念与技术。主要内容包括:控制系统的分层结构设计,开环与闭环控制的原理及特点,PWM调速技术及其调制方式,PID控制算法及其数字化实现方法,以及控制系统的性能评估指标。同时探讨了现代BLDC控制器硬件实现方案,并介绍了磁场定向控制(FOC)、直接转矩控制(DTC)等先进控制策略。文章全面阐述了BLDC电机控制从基本原理到前沿技术的知识体系,为相关应用提供了理论指导和技术参考。

技术工作者 491

uniapp - 微信支付报错 {“errMsg“:“requestPayment:fail:[payment微信:-1]General errors“} 详细解决办法,uniApp使用微信支付时报错

uniapp,微信支付报错,uniapp微信小程序 H5网页 安卓苹果ios真机调试时报错,uniapp真机测试微信支付报错如何解决,调用微信支付出现报错{"errMsg":"requestPayment:fail:[payment微信:-1]General errors"},微信支付提示错误,uniapp进行微信支付时报错怎么解决,如何解决微信支付报错,uniapp微信支付报错fail,uni-app真机测试ios上报错,uniapp真机测试安卓手机第一次支付成功第二次就报错了,uniapp微信支付调用第

✅ 精选推荐文章 4134

[数据结构]有些事不见不知道——栈和队列刷题 :有效的括号、用栈实现队列、用队列实现栈、循环队列

人见人爱目录君有效的括号分析时间代码用栈实现队列用队列实现栈设计循环队列喜闻乐见的分析环节代码实现数组版本链表版本一些栈和队列的选择题最后 菜鸡大学生的数据结构——刷题篇5 磕磕绊绊终于到了栈和队列,菜鸡大学生在水完一篇文章之后心情极佳鸡血上头,决定对栈和队列的题目进行一波制裁。 结果痛心地发现栈和队列这些数据结构c语言是没有现成的库的,它们的代码还得自己手敲一遍,遂,cv。 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足

Jessica的博客 1468

小麦病害检测系统开发

本项目旨在针对小麦病害小目标检测任务,在YOLOv11基础上进行三项改进: - 将主干网络替换为Swin Transformer,增强全局特征提取能力。 - 在检测头中引入DynamicHead,并增加检测头数量至四个,提升多尺度检测性能。 - 集成半监督FixMatch训练框架,利用无标签数据提升模型泛化能力。 我们定义五个模型进行对比实验: - Model 0: 原始YOLOv11 (有监督) - Model 1: YOLOv11 + Swin Transformer (有监督) ~~~~~~

AI的内部世界的博客 121

【Java数据结构】实现栈和队列

【Java数据结构】实现栈和队列

yanxiang3306 6609

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【数据结构初阶】队列接口实现及用队列实现栈超详解

1. 概念 1. 1 队列底层结构选型 1. 2 队列定义 2. 接口实现 2. 1 初始化 2. 2 判空 2. 3 入队列 2. 4 出队列 2. 5 队尾元素和队头元素和队列元素个数 2. 6 销毁 2. 7 接口的意义 3. 经典OJ题 3. 1 用队列实现栈 3. 1. 1 栈的定义 3. 1. 2 栈的初始化 3. 1. 3 入栈 3. 1. 4 出栈 3. 1. 5 取栈顶元素 3. 1. 6 判空 3. 1. 7 销毁

fhvyxyci的博客 2050

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【数据结构】学习了栈和队列,那么如何用栈实现队列,用队列实现栈的功能呢?

我们都知道队列、栈,那么如何用栈实现队列的功能?如何用队列实现栈的功能呢?

知识记录 566

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【数据结构与算法】之详解栈与队列及其实现!

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为队尾 出。栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数 组头上出数据,效率会比较低。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

2301_80221228的博客 1274

【数据结构】栈和队列的代码实现

栈和队列的相关知识以及代码的实现

jhj9201633的博客 1225

【LeetCode&数据结构】栈和队列的应用——用队列实现栈问题、用栈实现队列问题详解

🔥❄🍉⭐️前言:牛客网和LeetCode的刷题都不可或缺,我们都要做一做,无论是参加竞赛还是笔试面试,至少能提升你的代码能力!洛谷的题目也可以去做一做。力扣的题目对提升代码能力很有帮助,需要有一点基础,几乎都是接口型的题目,关于接口型和IO型的区别我们在本专栏的第一篇中就介绍过了,这里不再赘述,我们进入今天的力扣题目介绍——

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 964

[C++数据结构]:用队列实现栈、以及用栈创建队列

[C++数据结构]:用栈创建队列、以及用队列实现栈.一、栈与队列的基础知识手绘栈与队列的区别:1.栈(Stack):3.二者的遍历规则栈:只有顶端元素可以访问,不允许挨个遍历 队列:只有队头和队尾可以访问和使用,不允许挨个遍历​ 推荐以力扣上的232题为基础学习:232. 用栈实现队列模拟入队出队的过程:注:在peek函数中,并没有重新定义,而是使用了之前的pop函数,第一如果重新写的话,提交会报错。第二这样可以提升代码的复用性。​推荐以力扣上的225题为基础学习:225. 用队列实现栈模拟入栈出栈

Callme_TeacherPi 1806

初级数据结构——栈与队列的互相实现

通过我之前的作品已经初步理解了栈和队列的数据结构,这期我们来学习如何实现这两个数据结构的互相转换。在计算机科学中,栈(Stack)和队列(Queue)是两种常见的数据结构,它们具有不同的操作特性和应用场景。栈遵循后进先出(LIFO, Last In First Out)的原则,而队列遵循先进先出(FIFO, First In First Out)的原则。尽管它们有不同的特性,但我们可以利用其中一种数据结构来实现另一种数据结构。通过以上方法,我们可以使用栈来实现队列,或使用队列来实现栈。

ycs66的博客 1669

java学习——数据结构——两个队列实现栈、两个栈实现队列

文章目录两个队列实现栈、两个栈实现队列1、两个队列实现栈2、两个栈实现队列 两个队列实现栈、两个栈实现队列 1、两个队列实现栈 2、两个栈实现队列 ...

weixin_42924812的博客 270

数据结构—栈、队列的实现

一.栈的介绍。 1.栈的定义: 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out) 的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据也在栈顶。 注意:栈的操作都在栈顶,不管进栈出栈都是在栈顶操作。 2...

weixin_42357849的博客 235

数据结构—队列与栈的相互实现以及相互比较

目录 一、队列实现栈 二、用栈实现队列 三、队列与栈的相互比较 一、队列实现栈 LeetCode题目链接:用队列实现栈 题目描述: 声明:下面再用队列实现栈的过程中,使用的实现队列功能的函数,在之前的文章中有详细记录 文章链接:数据结构—队列的C语言实现 1、定义用队列实现栈的结构体 typedef struct { Queue q1; Queue q2; } MyStack; 2、创建栈 动态开辟一个用队列实现栈的结构体空间,然后再调用队列的初始化函数,.

weixin_56438185的博客 1455

【数据结构初阶】详解:实现循环队列、用栈实现队列、用队列实现栈

如果popst内的数据为空,就将pushst内的数据导入popst中,此时从popst中按栈的顺序出数据时,所出顺序即为队列的出数据顺序。我们开始就说过,循环队列的数据储存的数量是固定的,为了方便讲解,我们这里设队列可储存4个数据。将不为空的队列中的队尾数据之前的所有数据导入为空的队列中,而原队列中只剩下要删除的元素。与队列的区别:循环队列的空间大小是固定的,且队尾连接队头形成循环。已经入了4个数据了,想要再入数据就要先出数据,把空间空出来。入的数据与出的数据的顺序相同,符合队列先进先出的逻辑。

2302_79531041的博客 1253

【数据结构初阶】一个队列怎么实现栈~~OJ

【数据结构初阶】你会用栈实现队列和用队列实现栈吗?

每天都要坚持刷题的博客 973
上一篇: 数据结构——队列
下一篇: 数据结构——用队列实现栈
Andy
博客等级 码龄4年 313粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值