数据结构:用栈实现队列
这道题让我们用栈来实现队列我们知道栈是后入先出的队列是先入先出的。我们需要用两个栈来达到以下功能入队1 2 3 4 出队1 2 3 4思路及分析过程我们按1 2 3 4的顺序入栈到随便一个里面当我们要出队的时候出的是1所以我们按顺序将stack1的元素入栈到stack2然后再让stack2出栈就把1取出来了如果再执行出队操作就让stack2再出栈就完成了。此时再入队一个5肯定不能入到stack2里面不然就变成队列中的队头了所以入到stack1中。此时如果要取队头元素取stack2就好了。根据以上分析我们会发现只要入队都是入到stack1中出队都是在stack2进行操作所以我们可以定义一个栈stackpush用来入队stackpop用来出队。然后实现题目要求的四个函数。代码实现定义结构体栈的实现我们之前写过直接拿过来。然后先让我们定义一个结构体我们定义两个栈初始化接下来是初始化函数MyQueue* myQueueCreate()让我们创建一个结构体然后把这个结构体指针返回来。我们就用malloc创建一个MyQueue大小的空间然后这两个栈直接调用初始化函数就好了记得是传栈的地址。入队接下来是入队操作的函数void myQueuePush(MyQueue* obj, int x)我们直接入到stackpush里面去出队然后就是出队操作的函数int myQueuePop(MyQueue* obj)我们需要判断stackpop是否为空栈如果为空栈则需要把stackpush里面的元素全都挪到stackpop里面然后再进行出队操作。这里面的两行代码转换为图是这样的先取stackpush的栈顶元素4入栈到stackpop里面然后删除stackpush的栈顶元素。直到stackpush的有效元素个数变成0挪元素过程结束。然后是出队操作我们先用top接收stackpop的栈顶元素因为需要返回删除的元素的值然后出栈就好了 。取队头元素接下来是返回队列开头的函数int myQueuePeek(MyQueue* obj)把stackpop的栈顶元素返回来就好了如果stackpop是空栈同样的要进行挪元素操作。判空然后是判断是否为空队的函数bool myQueueEmpty(MyQueue* obj)只要两个栈都为空就是空队。销毁然后就是销毁队的函数void myQueueFree(MyQueue* obj)了我们把这两个栈销毁然后释放掉MyQueue*指针obj的空间再置为NULL就好了。