这回面试题来自掌阅的面试
通过这个图就能发现,虽然是python面试,但是很多部分都是数据结构的题,这是因为,数据结构难度比较大,能全做出来面试基本就稳了
但是把我就有个疑问,一个正常工作的人真的能做出来这种题么?
我感觉不经过培训肯定是无法完全做对这种题的,而且面试你的人都不一定能做对。
不说废话了进入正题。
栈:先进后出 1,2,3,4进入取出来顺序为4,3,2,1
队:先进先出1,2,3,4进入1,2,3,4取出
1、两个栈实现队
我们把1,2,3,4进入一个栈取出来后变为4,3,2,1,再把4,3,2,1放入另一个栈取出来后变为1,2,3,4,这就实现了队的先进先出。
代码:
结果:
实现了先入先出。
2、两个队实现栈
网上有个好理解的方法但是是有bug的,当取到最后一个元素时,向第一个队中添加元素,就会导致在取出时顺序发生改变,不过可以通过插旗或者多重判断避免,但是很麻烦。有兴趣的可以自己完善,代码如下:
出bug的结果:
我们模拟栈应该实现的是先进后出,也就是后进先出,我们取到就剩一个1的时候,又添加了6,再取应该先取6.但是结果是:
问题出在了:
if len(self.queue1)==1 and len(self.queue2)>1:和elif len(self.queue2)==1 and len(self.queue1)>=1:上当取到最后一个判断的时候判断的不够详细。
我们讲一个高端的两个队实现栈的方法:
我们设置:
队1为专门存储元素用的队
队2为专门弹出元素用的队
我们给队1传入1,2,3,4.然后取出直到队1只剩1个元素,也就是4,把取出的元素放入队2。然后把队1中剩余的4取出来。这样最后传入4,首先取出4。
我们要求的是队1存储元素,队2是弹出元素的,现在对2中有元素,所以调换队1和队2的名字,
然后继续执行取出直到队1只剩1个元素,也就是3,把取出的元素放入队2。然后把队1中剩余的3取出来。这样最后传入4,3,首先取出4,3。
再调换名字,依此类推:
代码实现:
结果: