一:题目
二:思路
1:先看两个概念:
2:题目的理解
用两个栈来实现队列(表面)
用栈的函数来实队列(深层)
用先进先出的栈函数 来实现后进先出的队列函数 (本质)
3:题目的要求
实现 MyQueue
类:
void push(int x)
将元素 x 推到队列的末尾int pop()
从队列的开头移除并返回元素int peek()
返回队列开头的元素boolean empty()
如果队列为空,返回true
;否则,返回false
4:思路讲解(如何达到先进先出的效果,1 2 3 4的顺序)
a:两个栈,一个叫pushst(只用来入队列),一个叫popst(只用来出队列)
b:将pushst栈的全部出栈到popst栈中
解释:
这时候再 对popst栈进行出栈操作,就是1 2 3 4 的顺序了,达到了队列的先进先出的效果
c:这时候来新的元素,要进行入队列函数操作,也就是照样放在只用来入队列的pushst
解释:
popst继续进行出栈的操作就能达到队列的先进先出(1 2 3 4 ),元素出完了后,再把pushst的元素像之前一样,通过出栈,放进popst,然后再对popst进行出栈,就能继续达到队列的效果(5 6)
注意:
写代码之前,我们得先把队列的实现 放在答题代码的前面
关于队列的实现函数,博主已经在前文栈的实现(一篇包懂)-CSDN博客中讲解了,并且已经在此题中应用且通过此题啦,所以放心使用吧!
三:代码展示及其解释
一:myQueueCreate(创建队列) 和MyQueue 结构体的实现
解释:
1:
根据我们前面的思路。所以创建两个栈pushst 和 popst
二:myQueuePush函数(入队列函数)
解释:
1:
根据前文思路,我们入队列就是往pushst栈中入栈即可。
三:myQueuePeek函数(返回队列开头的元素)
解释:
1:
返回队列开头的元素相比出队列,只是少了删除队列开头元素这一步
2:
根据前文思路,我们把popst栈中的栈顶的元素return 即可,不需要出栈此元素,不然就成了出队列的函数了。
3:popst一定得有元素,才能进行对popst栈的栈顶的元素的return,所以要先判断popst是否为空,空的话,就根据思路,把pushst栈的元素全部都先出栈,再入栈到popst栈中即可!
四:myQueuePop函数(出队列函数)
解释:
1:
直接复用myQueuePeek函数即可,就不用再进行检测popst是否为空及后面的一系列操作了,再将popst栈的栈顶元素出掉,达到出队列的效果。
2:题目中myQueuePeek函数是在myQueuePop的后面,做题的时候,将myQueuePeek手动换到前面就行。
五:myQueueEmpty函数(判断队列是否为空)
解释:
1:
两个栈都空,队列才叫空。
六:myQueueFree函数(销毁队列函数)
解释:
1:
先释放两个栈,在释放掉obj。