数据结构:用队列实现栈

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

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

其余函数

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

相关推荐
想做小南娘,发现自己是女生喵7 分钟前
QT项目实战第一周(嵌入式)
开发语言·qt
信奥卷王9 分钟前
[GESP202406 六级] 二叉树(含视频)
数据结构·算法
学逆向的14 分钟前
C 可变量参数
c语言·开发语言·网络安全
andyweike14 分钟前
kotlin dsl library工程怎么配置
android·开发语言·kotlin
huaweichenai21 分钟前
php搭建mcp服务
开发语言·php·ai编程
估值探索者33 分钟前
【Python量化技术指标实战 02】MACD金叉也分强弱?手工算一次 DIF/DEA 就懂了
java·开发语言·python·股票数据·股票数据api接口
讳疾忌医丶35 分钟前
编译器眼中的 C++ 循环:从指针别名、IEEE 754 结合律到 SIMD 语义证明
开发语言·c++
重生六道1 小时前
B站视频时长统计:一段JS脚本搞定分P/合集总时长(附倍速计算)
开发语言·javascript·音视频
XiYang-DING1 小时前
P5528.带过期时间的 LRU 缓存
java·开发语言·缓存
小徐不徐说1 小时前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv