这道题让我们用两个队列来实现栈,我们知道,队列是先入先出的,栈是先入后出的。
入栈: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个元素。
其余函数
然后就是取栈顶元素,判断是否为空,释放空间等函数,大部分只需要调用队列的函数,很简单就不说了,直接给出来。