栈和队列面试题总结

1. 在O(1)时间内实现栈的push、pop、min操作

分析:push和pop操作都很好做到,但是min操作就没这么容易了,首先想到的肯定是设置一个flag在每次push的时候纪录下最小值,但是考虑一下如果pop的时候正好pop掉了最小值怎么办呢?

解决:使用两个stack,一个存放数据,另一个存放每次push后的最小值,这样当pop数据的时候,若是正好是最小值,则将stack2也pop掉。

巧妙:于是对于上一题目,我把一个栈当成两个用,就是说,每次push,先入栈当前元素,然后入栈当前栈中最小元素;pop则每次弹出2个元素。


2. 用两个stack实现一个queue

解决:一个stack1存放enqueue的数据,另一个stack2存放stack1的反转后的数据。每次enqueue存放入stack1中,dequeue从stack2中pop,当stack2为空的时候,将stack1中的元素pop放入stack2。


3. 用两个queue实现stack

解决:pop时将queue1中的n-1个元素放入queue2中,在pop掉,push时存入不为空的那个queue中。


4. 栈的push、pop序列是否一致
输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。
比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,pop,pop,这样得到的pop序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是push序列1、2、3、4、5的pop序列。

解决:用模拟法,依次将arr1的元素push进栈,并检查栈顶元素是否等于arr2的pop元素。


5. 一个数组实现两个栈

解决:交叉索引,一个栈下标0,2,4...另一个1,3,5...或者两个栈从不同方向增长


6. 一个数组实现三个栈

解决:交叉索引,两个栈从不同方向增长,第三个从中间。

你可能感兴趣的:(面试题,栈)