当前位置: 首页 > news >正文

【数据结构算法经典题目刨析(c语言)】使用栈实现队列(图文详解)

💓 博客主页:C-SDN花园GGbond

⏩ 文章专栏:数据结构经典题目刨析(c语言)

目录

一.题目描述  

二.解题思路 

三.代码实现


 

一.题目描述  

题目链接: 用栈实现队列 

二.解题思路 

此题可以用两个栈实现,一个栈进行入队操作,另一个栈进行出队操作
出队操作: 当出队的栈不为空是,直接进行出栈操作,如果为空,需要把入队的栈元素全部导入到出队的栈,然后再进行出栈操作

上一章节, 我们使用了队列来实现栈, 本次我们使用栈来实现队列, 两道题的思路都是差不多的, 本题使用两个栈实现队列, 我们可以让一个栈进行插入操作, 另一个栈进行出队列操作, 插入元素到pushst中, 如果需要删除元素, 先判断popst是否为空, 为空的话把pushst中所有元素导入到popst中, 只需要导一次, 然后如果不为空, 只需要pop出栈顶元素.

画图演示: 

 

 

三.代码实现

typedef int STDataType;typedef struct Stack
{STDataType* a;int top;int capacity;
}ST;void STInit(ST* pst)
{assert(pst);pst->a = NULL;//指向栈顶数据的下一个位置pst->top = 0;pst->capacity = 0;
}
void Destroy(ST* pst)
{assert(pst);free(pst->a);pst->a = NULL;pst->top = pst->capacity = 0;
}//入栈和出栈
void STPush(ST* pst, STDataType x)
{assert(pst);if (pst->capacity == pst->top){int newCapacity = pst->capacity==0 ? 4 : pst->capacity * 2;STDataType* tmp = (STDataType*)realloc(pst->a, newCapacity * sizeof(STDataType));if (tmp == NULL){perror("malloc fail");return;}pst->a = tmp;pst->capacity = newCapacity;}pst->a[pst->top] = x;pst->top++;
}
void STPop(ST* pst)
{assert(pst);assert(pst->top>0);pst->top--;
}//取栈顶数据
STDataType STTop(ST* pst)
{assert(pst);assert(pst->top > 0);return pst->a[pst->top-1];
}//判空
bool STEmpty(ST* pst)
{assert(pst);return pst->top == 0;
}int STSize(ST* pst)
{assert(pst);return pst->top;
}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 myQueuePop(MyQueue* obj) {if(STEmpty(&obj->popst)){while(STSize(&obj->pushst)>0){STPush(&obj->popst,STTop(&obj->pushst));STPop(&obj->pushst);}}int ret=STTop(&obj->popst);STPop(&obj->popst);return ret;
}int myQueuePeek(MyQueue* obj) {if(STEmpty(&obj->popst)){while(STSize(&obj->pushst)>0){STPush(&obj->popst,STTop(&obj->pushst));STPop(&obj->pushst);}}int ret=STTop(&obj->popst);return ret;
}bool myQueueEmpty(MyQueue* obj) {return STEmpty(&obj->pushst)&&STEmpty(&obj->popst);
}void myQueueFree(MyQueue* obj) {Destroy(&obj->pushst);Destroy(&obj->popst);free(obj);
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • javaEE中自定义注解以及注解的解析
  • CSP部分模拟题题解
  • 探索sqlmap的奥秘:Python中的强大SQL注入检测工具
  • python实现K-means图像聚类
  • Kubernetes--命令行工具 kubectl
  • 参与团体标准的意义以及作用
  • 旋转图像(LeetCode)
  • docker 启动 mongo,redis,nacos.
  • 网络安全实训第三天(文件上传、SQL注入漏洞)
  • 用7EPhone云手机进行TikTok的矩阵运营
  • 自己对对抗性样本的实质的理解
  • 【深度学习】【语音】TTS, 如何使用Python分析WAV的采样率、比特深度、通道数
  • windows中electron,使用electron-builder构建时由于文件过大导致构建失败解决方案
  • 构建具有音频功能的中英翻译器:一个Python应用程序的旅程
  • 启发式算法之模拟退火算法
  • CentOS 7 修改主机名
  • dva中组件的懒加载
  • Java多态
  • JDK9: 集成 Jshell 和 Maven 项目.
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Kibana配置logstash,报表一体化
  • LeetCode29.两数相除 JavaScript
  • Linux快速复制或删除大量小文件
  • miaov-React 最佳入门
  • nodejs实现webservice问题总结
  • Octave 入门
  • React+TypeScript入门
  • 阿里云应用高可用服务公测发布
  • 容器服务kubernetes弹性伸缩高级用法
  • 一个SAP顾问在美国的这些年
  • 一些css基础学习笔记
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 组复制官方翻译九、Group Replication Technical Details
  • # 飞书APP集成平台-数字化落地
  • #QT(TCP网络编程-服务端)
  • #WEB前端(HTML属性)
  • #职场发展#其他
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (四)鸿鹄云架构一服务注册中心
  • (一)Kafka 安全之使用 SASL 进行身份验证 —— JAAS 配置、SASL 配置
  • (转载)hibernate缓存
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .NET CORE 第一节 创建基本的 asp.net core
  • @GetMapping和@RequestMapping的区别
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [15] 使用Opencv_CUDA 模块实现基本计算机视觉程序
  • [3D基础]理解计算机3D图形学中的坐标系变换
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Android学习笔记]ScrollView的使用
  • [Asp.net mvc]国际化
  • [CISCN 2019华东南]Web11