力扣经典题目之->用栈实现队列 的详细讲解与实现,看这篇就够了!

一:题目

二:思路

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。 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值