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

数据结构:用队列实现栈


这道题让我们用两个队列来实现栈,我们知道,队列是先入先出的,栈是先入后出的。
入栈:1 2 3 4 出栈:4 3 2 1

思路及分析过程

我们先按顺序入队1 2 3 4到随便一个队列里面:

然后出栈,出栈要删除的元素是4,所以我们要把1 2 3全都挪到另一个队列queue2里面,再把queue1里面的4删除掉。

取栈顶元素就把队尾取出来就好了,取的是非空队列的队尾。

此时再入栈5,5会变成栈顶,如果我们把5入队到queue1这个空队列的话,显然不行,因为后续如果还要挪元素的话(入队),queue1中元素的顺序就会变成:5 1 2 3,显然不符合栈中元素存放的顺序,所以入栈时我们选择入队到非空队列queue2中。

然后执行出栈操作,把5取出来,就是把非空队列queue2中的前size-1个元素移到空队列queue1中,然后再把5取出来。

综上分析,我们入栈时将元素入到非空队列里面,出栈时将非空队列里面的前size-1个元素移到空队列里面,再出队,取栈顶元素就是取非空队列的队尾元素。清楚思路后就可以开始实现了。

代码实现

定义结构体

我们把之前实现队列的代码直接拿过来,主要来实现该题目的要求。
我们要先定义一个MyStack结构体,直接定义两个栈就好了。

初始化

然后是初始化函数MyStack* myStackCreate(),我们申请一个结构体大小的空间,然后调用队列的初始化函数来初始化这两个队列(注意传的是队列的地址),再把该结构体返回来就好了。

入栈

然后是入栈函数void myStackPush(MyStack* obj, int x),我们入队到非空队列就好了,queue1为空则直接入到queue2中,不需要区分是不是第一次入队。

出栈

接下来是出栈函数int myStackPop(MyStack* obj),我们可以采用假设法,先设queue1为空队列emptyqueue,queue2为非空队列Noemptyqueue,如果假设错误就反一下就好了,将非空队列的前size-1个元素挪到空队列中,然后用top接收非空队列中剩下的一个元素(作为返回值),再出队这个元素。

挪前size-1个元素内部逻辑是这样的,将非空队列的队头元素入队到空队列中,然后非空队列再执行出队操作。

一直到挪完非空队列前size-1个元素。

其余函数

然后就是取栈顶元素,判断是否为空,释放空间等函数,大部分只需要调用队列的函数,很简单就不说了,直接给出来。

http://www.jsqmd.com/news/1171910/

相关文章:

  • PilotGo-plugin-grafana版本升级指南:平滑升级与向后兼容性保证
  • Alpha Vantage股票数据下载器:构建生产级金融数据管道
  • 企业网盘技术选型:教育行业文件存储与协同方案对比分析
  • 用GPT-4做Python入门教学协作者:Data Doc思维校准法
  • Cursor Custom Mode工程化实践:构建可运维的AI执行团队
  • Windows Terminal v1.24 配置进阶:3步集成 Conda 与 Git 实现开发环境统一
  • Swarm:面向任务分解的轻量级多Agent运行时框架解析
  • ESP32P4之LVGL从0到1教学(一) 环境配置
  • 802.11 Deauth Reason Code 实战解析:从Wireshark捕获到7种常见故障定位
  • 2026年最新盘点8个AI论文平台,半天写完一篇论文!
  • MFS分布式文件系统:高可用集群部署实战
  • TexLive 2024 + VSCode LaTeX Workshop 配置:3步解决 macOS PATH 与 PDF 自动刷新
  • C++控制台计费系统:数据结构、文件I/O与分层架构实战
  • C++实战:简易日程安排系统开发全解析与STL容器应用
  • Windows平台pthreads-w32配置指南:跨平台多线程开发实战
  • RouterOS 6.48.6 密码恢复:CentOS 7.9 救援模式挂载与文件删除实操
  • UniDriveVLA:自动驾驶语义驱动范式革命
  • 彻底搞懂Windows运行库:从DLL原理到一劳永逸的安装方案
  • uos-openldap-exporter核心功能解析:5大类关键指标助你掌控LDAP服务健康
  • ES2020核心特性实战指南:可选链、空值合并与BigInt落地
  • 个人创业怎么选赛道?互联网广告代理项目全面拆解
  • Vivado 2023.1 工程瘦身实战:3步压缩至原大小1%,保留源码与IP配置
  • 棒球投球运动生物力学建模与释放点动力学反演实战
  • 做小红书图文太头秃?这款开源 AI 神器,一句话帮你搞定!
  • ENSP 1.3 多网段 DHCP 中继配置:3个 VLAN 跨网段地址池实战
  • Gemini Omni Flash API:对话式视频生成技术实战指南
  • 多维聚合本质:维度坐标系重构与数据操纵语义
  • Altium Designer 24 原理图编译实战:3步定位并解决5类常见Error与Warning
  • MySQL Workbench 8.0 连接本地 MySQL 服务:5步解决“无法连接”与密码重置
  • Leaflet加载山东省天地图(第三版)基于vue2环境