1. 设计含min函数的栈,要求min,push和pop时间复杂度都是O(1)。
设计一个辅助栈,存储当前栈中元素的最小值。
Push操作时,第一个元素不用比较,自动成为最小值入栈,其它元素每次都和栈顶元素比较,小的那个放到栈顶。注意:这里如果当前辅助栈顶元素小于新元素,则把辅助栈顶元素再入栈一次。Pop的时候,同时从原栈和辅助栈pop。所以,原栈和辅助栈大小相等。
2. 用两个栈实现队列
(1),stack1存的是每次进来的元素,所以Enqueue就是把进来的元素push到stack1中;
(2),对于Dequeue,一开始stack2为空,所以我们把stack1中的元素全部pop到stack2中,这样stack2的栈顶元素就是队头。只要stack2不为空,那么每次出队,就相当于stack2的pop;
(3),接下来,每一个元素入队时仍然push到stack1中。没出队一个元素,如果stack2不为空,就从stack2中pop一个元素,如果stack2为空,就重复上面的操作,即把stack1中元素全部pop到stack2中。
(4),Peek操作,类似于Dequeue,若stack2不空,则调用stack2的peek操作,若stack2为空,则把stack1中全部元素pop到stack2,并调用stack2的peek
(5),注意边界条件,只有stack1和stack2都为空,队列才为空。
3. 用两个队列实现栈
(1)所有数据都存在一个队列中
(2)在pop和peek时,将前n-1个元素出队,并入队到另一个队列,pop时,直接出队最后一个元素,peek时,出队最后一个元素,返回其值,并继续讲其入队到两一个队列。
(3)push时,将元素入队到不为空的那个队列。
感觉这样的实现没什么实际意义。
4. 栈的push,pop序列是否一致
输入两个整数序列,其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。简单起见,假设push序列的任意两个整数都是不相等的。
比如输入的序列是1,2,3,4,5,那么4,5,3,2,1,就可能是一个pop序列。
解法:
- 把入栈序列入栈,直到栈顶元素等于出栈序列首元素;
- pop栈,出栈序列后移一个元素,并比较当前栈顶元素和出栈序列当前元素是否相等,若相等则继续2的操作;
- 若不相等,继续把入栈队列入栈,直到栈顶元素与出栈序列当前元素相等,并继续2的操作;
- 如果入栈队列一直入栈到最末尾尚未使得栈顶元素等于出栈序列当前元素,则说明不匹配。
第一个栈,从左向右增长,第二个栈,从右向左增长,如果数组满,则将数组size变为原来两倍。
6. 用一个数组实现三个栈
一个从左到右,一个从右到左,第三个从中间(mid)开始,入栈规律可以如下:
- 第一个入栈C的元素进mid处;
- 第二个入栈C的元素进mid+1处;
- 第三个入栈C的元素进mid-1处;
- 第四个入栈C的元素进mid+2处。