【数据结构与算法 经典例题】使用栈实现队列(图文详解)
💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《数据结构与算法 经典例题》C语言
期待您的关注

目录
一、问题描述
二、前置知识
三、解题思路
原理:
图解:
注:
四、C语言实现代码
🍃栈实现代码:
🍃栈实现队列代码:
🍃测试文件及结果:
一、问题描述
原题出自
232. 用栈实现队列 - 力扣(LeetCode)

二、前置知识
关于栈的详细讲解请阅读这篇文章
【数据结构与算法】使用数组实现栈:原理、步骤与应用-CSDN博客
关于队列的详细讲解请阅读这篇文章
【数据结构与算法】使用单链表实现队列:原理、步骤与应用-CSDN博客
三、解题思路
使用两个栈(Stack)来实现队列(Queue)的功能是一个经典的算法问题。栈和队列在数据结构上是两种完全不同的类型(栈是后进先出,队列是先进先出),解决问题的关键就在于如何巧妙地利用两个栈的后进先出的特性来模拟队列先进先出的行为。
原理:
- 结构定义:我们定义两个栈,
stack1和stack2。其中一个栈(例如stack1)用于入队操作,另一个栈(例如stack2)用于出队操作。- 入队操作:所有元素都压入
stack1。- 出队操作:
- 如果
stack2不为空,直接从stack2弹出栈顶元素,作为出队元素。- 如果
stack2为空,则将stack1中的所有元素逐个弹出并压入stack2(这个操作实际上是将stack1的元素反转后压入stack2),然后再从stack2弹出栈顶元素,作为出队元素。- 取队首元素:类似出队操作,只是最后支取栈顶元素,不出栈
图解:
(为方便理解对队列的结构进行了简化)


取队首元素类似于出队列,只是取出的元素不出栈
注:
另外还有一种可行的实现方式:
结构定义:一个栈用来出队列和入队列,另一个栈保持为空,只用来移动数据
- 入队列:都入到非空栈
- 出队列 :先将非空栈的所有元素(除了最后一个)移到空栈,最后的元素出栈并返回,并将移出的元素移动回来恢复顺序
- 取队首元素:先将非空栈的所有元素(除了最后一个)移到空栈,最后的元素返回,再将移出的元素移动回来恢复顺序
这种方法在理论上是可行的,只不过每次出队列或取队首元素都需要将栈的元素移动两遍,效率比较低,因此这里就不给出实现代码了,建议使用第一种方式
四、C语言实现代码
🍃栈实现代码:
// 支持动态增长的栈
typedef int STDataType;//对数据类型重命名,方便后期修改类型
typedef struct Stack
{STDataType* a;int top; // 栈顶int capacity; // 容量
}Stack;//定义结构同时重命名
// 初始化栈
void StackInit(Stack* ps)
{assert(ps);ps->a = NULL;ps->top = ps->capacity = 0;
}// 入栈
void StackPush(Stack* ps, STDataType data)
{assert(ps);//判断是否需要扩容if (ps->top == ps->capacity){int newcapa = ps->capacity == 0 ? 4 : 2 * (ps->capacity);STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newcapa);if (tmp == NULL){perror("realloc\n");exit(1);}ps->a = tmp;ps->capacity = newcapa;}//确定空间足够之后再插入数据ps->a[ps->top] = data;ps->top++;
}// 出栈
void StackPop(Stack* ps)
{assert(ps);assert(ps->top);ps->top--;
}// 获取栈顶元素
STDataType StackTop(Stack* ps)
{assert(ps);assert(ps->top);return ps->a[ps->top-1];
}// 获取栈中有效元素个数
int StackSize(Stack* ps)
{assert(ps);return ps->top;
}// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{assert(ps);return ps->top == 0;
}// 销毁栈
void StackDestroy(Stack* ps)
{assert(ps);free(ps->a);ps->a = NULL;ps->top = ps->capacity = 0;
}
🍃栈实现队列代码:
typedef struct {Stack pushst;//入数据的栈Stack popst;//出数据的栈
} MyQueue;MyQueue* myQueueCreate() //初始化
{MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));StackInit(&(obj->pushst));StackInit(&(obj->popst));return obj;
}void myQueuePush(MyQueue* obj, int x) //模拟入队列
{assert(obj);StackPush(&(obj->pushst), x);//入队列直接插入到pushst栈
}int myQueuePop(MyQueue* obj) //模拟出队列
{assert(obj);assert(!StackEmpty(&(obj->popst)) || !StackEmpty(&(obj->pushst)));//首先两个栈不能都为空if (StackEmpty(&(obj->popst)))//如果popst栈为空,把数据倒过去{while (obj->pushst.top){StackPush(&(obj->popst), StackTop(&(obj->pushst)));StackPop (&(obj->pushst));}}int top = StackTop(&(obj->popst));StackPop(&(obj->popst));//再从popst栈出数据return top;
}int myQueuePeek(MyQueue* obj) //模拟取队列首元素
{assert(obj);assert(!StackEmpty(&(obj->popst)) || !StackEmpty(&(obj->pushst)));if (StackEmpty(&(obj->popst)))//如果popst栈为空,把数据倒过去{while (obj->pushst.top){StackPush(&(obj->popst), StackTop(&(obj->pushst)));StackPop(&(obj->pushst));}}return StackTop(&(obj->popst));
}bool myQueueEmpty(MyQueue* obj) //模拟队列判空
{return StackEmpty(&(obj->pushst)) && StackEmpty(&(obj->popst));
}void myQueueFree(MyQueue* obj) //销毁
{StackDestroy(&(obj->pushst));StackDestroy(&(obj->popst));free(obj);obj = NULL;
}
🍃测试文件及结果:
void test2()
{MyQueue* Queue = myQueueCreate();if (myQueueEmpty(Queue))printf("队列空\n");elseprintf("队列非空\n");myQueuePush(Queue, 1);myQueuePush(Queue, 2);myQueuePush(Queue, 3);myQueuePush(Queue, 4);printf("队首元素 %d\n", myQueuePeek(Queue));if (myQueueEmpty(Queue))printf("队列空\n");elseprintf("队列非空\n");while (!myQueueEmpty(Queue)){printf("%d ", myQueuePop(Queue));}printf("\n");if (myQueueEmpty(Queue))printf("队列空\n");elseprintf("队列非空\n");myQueueFree(Queue);
}


相关文章:
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、前置知识 三、解题思路 原理: 图解&…...
不知大家信不信,竟有这么巧的事,我领导的老婆,竟然是我老婆的下属,我在想要不要利用下这层关系,改善下领导对我的态度,领导怕老婆
职场如战场,每个人都身不由己。每天上班,除了要面对堆积如山的工作,还要小心应对来自领导的“狂风暴雨”。最近,我无意间发现领导一个秘密,这个秘密让我对职场关系和人性都产生了新的思考。 故事要从那天晚上说起。我…...
使用pkg -r 命令选项向jail虚拟子系统里安装软件@FreeBSD
刷FreeBSD 论坛的时候,看到这样一招:使用pkg -r选项,往jail等虚拟机子系统里安装软件。jails - How to install a pkg offline into a jail? | The FreeBSD Forums rootfbhost:~ # pkg pkg: not enough arguments Usage: pkg [-v] [-d] [-l…...
Go语言开发框架GoFly已集成数据可视化大屏开发功能,让开发者只专注业务开发,本文指导大家如何使用
前言 框架提供数据大屏开发基础,是考虑当前市场软件应用有一大部分是需要把业务数据做出大屏,很多政府项目对大屏需求特别高,还有生产企业项目也对大屏有需求,没有提供基础规范的后台框架,在开发大屏需要很多时间去基…...
PR模板 | RGB特效视频标题模板Titles | MOGRT
RGB特效视频标题模板mogrt免费下载 4K分辨率(38402160) 支持任何语言 友好的界面 输入和输出动画 快速渲染 视频教程 免费下载:https://prmuban.com/39055.html 更多pr模板视频素材下载地址:https://prmuban.com...
python替换文件内容
# 打开文件with open(name, r) as file:content file.read()# 替换内容old_string binarynew_string cc_library_sharedcontent content.replace(old_string, new_string)# 写回文件with open(name, w) as file:file.write(content)...
SD-WAN是什么?它有哪些应用领域?
随着企业业务的不断扩展和数字化转型的加速,传统网络架构已无法满足企业对高效、灵活和安全网络连接的需求。在此背景下,SD-WAN(软件定义广域网)应运而生,为企业带来了全新的网络连接体验。本文将详细介绍SD-WAN网络及…...
PHP-CGI的漏洞(CVE-2024-4577)
通过前两篇文章的铺垫,现在我们可以了解 CVE-2024-4577这个漏洞的原理 漏洞原理 CVE-2024-4577是CVE-2012-1823这个老漏洞的绕过,php cgi的老漏洞至今已经12年,具体可以参考我的另一个文档 简单来说,就是使用cgi模式运行的PHP&…...
人工智能前沿讲座——AIGC
目录 前情提要 一、什么是AIGC AIGC与传统的AI有何区别? 二、发展历程 GAN 生成对抗网络 大模型与Transformer Transformer\BERT\GPT 扩散模型和稳定扩散模型 三、AIGC的发展应用 新质生产力 前情提要 小学期某一门课的笔记,老师名字隐去&…...
CCF 第33次CCF计算机软件能力认证第二题
相似度计算 刷新 时间限制: 1.0 秒 空间限制: 512 MiB 下载题目目录(样例文件) 题目背景 两个集合的 Jaccard 相似度定义为:𝑆𝑖𝑚(𝐴,𝐵)∣…...
python 学习积累
持续更新中 感受python的强大之case列举: 1. 生成的map list要经过json格式化写入文件,请用python实现这一需求 import json map{"name": "张三", "age": 18, "address": "北京"} list[] for i in …...
ARM day1总结
思维导图...
套路化编程:C# ListView 保存、恢复列宽度
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 目录 技术基础 保存列头 删…...
python单元测试
文章目录 单元测试定义断言函数Test FixturesMockpatch装饰器模拟(首选)上下文管理器模拟手动模拟 测试实例 测试覆盖率pytest框架起步安装使用常用参数跳过测试pytest.fixtureconftest.py参数化测试 数据库查询的mock覆盖率 单元测试 定义 单元测试是…...
华为---静态路由-浮动静态路由及负载均衡(二)
7.2 浮动静态路由及负载均衡 7.2.1 原理概述 浮动静态路由(Floating Static Route)是一种特殊的静态路由,通过配置去往相同的目的网段,但优先级不同的静态路由,以保证在网络中优先级较高的路由,即主路由失效的情况下,…...
Maven deploy上传远程私服失败
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project 你的项目: Cannot deploy artifacts when Maven is in offline mode 解决方案: 1.IDEA把这个钩子去掉 2. settings.xml里把 <offline>标…...
通天星CMSV6车载定位监控平台 point_manage/merge SQL注入致RCE漏洞复现
0x01 产品简介 通天星CMSV6车载定位监控平台拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。 0x02 漏洞概述 …...
图像识别技术在人脸识别领域的新突破
图像识别技术在人脸识别领域的新突破主要体现在多个方面,这些突破不仅提高了人脸识别的准确性和效率,还拓展了其应用领域。以下是对这些新突破的详细归纳: 深度学习技术的应用: 深度学习技术,特别是卷积神经网络&…...
iview 组件里面的(任何一个月)整月日期全部选中_iview时间轴选中有历史记录日期
iview 组件里面的整月日期全部选中: ①:第一种是当前月的日期全部选中: 先上效果图:当前月分 获取到的值: 当前月的方法: // getDateStr() {// var curDate new Date();// var curMonth curDate.ge…...
Charles配置与API数据抓取
2024软件测试面试刷题,这个小程序(永久刷题),靠它快速找到工作了!(刷题APP的天花板)-CSDN博客跳槽涨薪的朋友们有福了,今天给大家推荐一个软件测试面试的刷题小程序。https://blog.c…...
从零打造互动徽章:激光切割与电容触摸的软硬件融合实践
1. 项目概述与核心思路如果你参加过技术大会或者创客市集,一定对那些闪烁着酷炫灯光、能与人互动的徽章印象深刻。这类被称为“Badge”的可穿戴设备,早已超越了单纯的身份标识功能,成为了展示技术、创意和社群文化的微型平台。今天要分享的&a…...
PHPExcel样式继承机制:减少代码冗余的终极指南
PHPExcel样式继承机制:减少代码冗余的终极指南 【免费下载链接】PHPExcel ARCHIVED 项目地址: https://gitcode.com/gh_mirrors/ph/PHPExcel 在处理Excel文件时,重复设置单元格样式不仅耗时还会导致代码臃肿。PHPExcel作为一款强大的PHP电子表格处…...
智能健身器材核心技术解析:从光学编码器到电机驱动的安华高方案
1. 项目概述:当健身器材遇上“芯”动力如果你拆开一台近两年新出的智能动感单车、划船机或者高端跑步机,大概率会在其控制主板的核心位置,发现一枚印着“Avago”或“Broadcom”标志的芯片。这不是偶然。安华高科技(Avago Technolo…...
终极指南:fmt库如何用SFINAE和Concepts构建现代C++类型特征系统
终极指南:fmt库如何用SFINAE和Concepts构建现代C类型特征系统 【免费下载链接】fmt A modern formatting library 项目地址: https://gitcode.com/GitHub_Trending/fm/fmt fmt库作为现代C格式化库的典范,巧妙融合了SFINAE(Substitutio…...
Task人工智能:如何用Go语言工具构建高效的ML模型训练流水线
Task人工智能:如何用Go语言工具构建高效的ML模型训练流水线 【免费下载链接】task A fast, cross-platform build tool inspired by Make, designed for modern workflows. 项目地址: https://gitcode.com/gh_mirrors/ta/task 在当今的机器学习开发中&#x…...
嵌入式扫码模组:POS机核心部件技术解析与选型指南
1. 项目概述:固定式POS机里的“眼睛”与“大脑”如果你拆开过一台超市、便利店或者餐厅里常见的固定式POS机,可能会发现一个有趣的现象:那个用来扫商品条码的“窗口”或“枪口”,其内部结构远比我们想象的要精密。它不是一个简单的…...
从数据到角度:手把手调试大疆C板BMI088,解决姿态解算精度跳动的那些坑
从数据到角度:手把手调试大疆C板BMI088,解决姿态解算精度跳动的那些坑 调试嵌入式系统中的传感器数据,尤其是姿态解算这类对精度要求极高的应用,往往需要开发者具备跨领域的知识储备和丰富的实战经验。本文将分享我在使用大疆C板搭…...
网盘下载新革命:一劳永逸的直链解析方案
网盘下载新革命:一劳永逸的直链解析方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云…...
热销榜单:2026年深圳App开发公司推荐,揪出大众推荐的五大高口碑产品
在2026年、深圳的App开发公司凭借其创新能力逐渐崭露头角。在这个市场中解决方案、从电商到物联网设计美学赢得了用户信任;而本凡码农科技则专注于小程序定制、满足市场对便捷应用的追求。还有、云码科技伴随着创新技术提供了更高等灵活性,而晨曦科技结合…...
Compose-Skill:为Jetpack Compose应用注入AI能力的组件化技能库
1. 项目概述:一个为Compose应用注入AI能力的技能库最近在折腾Jetpack Compose项目时,我一直在想,能不能让UI开发也“智能”一点?比如,用户输入一段模糊的描述,界面就能自动生成对应的组件布局;或…...
