数据结构:用队列实现栈

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

入栈: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个元素。

其余函数

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

相关推荐
wifi___1 天前
全局异常处理的原理
java·开发语言
我变成萤火虫1 天前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
平常心的技术小牛1 天前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆1 天前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
余额瞒着我当琳1 天前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪1 天前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw1 天前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠1 天前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
SL-staff1 天前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
SomeB1oody1 天前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程