面试题三:设计包含 min 函数的栈。

来源:互联网 发布:ecmall 数据库表结构 编辑:程序博客网 时间:2024/05/18 06:09

3.设计包含 min 函数的栈。
定义栈的数据结构,要求添加一个 min 函数,能够得到栈的最小元素。
要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。


思路分析:
a.要想一个在栈中找出栈的最小值,且时间复杂度为1,我们可能回想到每次向栈插入push()一个值都对其进行排序操作,将最小值放在栈顶,但是我们很快会发现这种方式破坏了栈的结构,不再满足栈的先进先出的特点了(FIFO),此法不行
b.通过一个成员函数来保存最新值,但当最小元素弹出栈pop()时,我们无法得到次小元素,所以此法也不行。
c.大家可能立马想到用数组了。通过数组来保存对栈进行插入或删除后栈中的最小值,但这有一个弊端,我们不知道要给数组申请大多的地址空间,因为我们事先无法确定会插入多少个数到栈中,此法不优
d.我们可以使用一个辅助栈来存放最小值
操作:

optiondataStack栈minStack栈push(3)33push(5)3,53,3push(2)3,5,23,3,2push(6)3,5,2,63,3,2,2pop()3,5,23,3,2pop()3,53,3minStack就是我们的辅助栈,dataStack就是主要的数据栈
现在我知道要得到栈中的最小值,就是辅助栈的栈顶元素故调用minStack.peek()。

Java代码如下:

package com.WuKung.blog;import java.util.Stack;/** * @author WuKung * @csdnURL http://blog.csdn.net/wu_kung/ * @createdDate 2014-4-7 下午11:18:47 */public class StackWithMin<E extends Comparable<E>> extends Stack<E>{Stack<E> data;Stack<E> min;public StackWithMin(Stack<E> data,Stack<E> min){this.data = data;this.min = min;}@Overridepublic E push(E item) {// TODO Auto-generated method stubif(data.size()==0||item.compareTo(min.peek())<0){min.push(item);}else{min.push(min.peek());}data.push(item);return super.push(item);}@Overridepublic synchronized E pop() {// TODO Auto-generated method stubif(!min.isEmpty()&&!data.isEmpty()){min.pop();data.pop();}return super.pop();}public E min(){return min.peek();}}
测试类:
package com.WuKung.blog;import java.util.Stack;/** * @author WuKung * @csdnURL http://blog.csdn.net/wu_kung/ * @createdDate 2014-4-8 上午12:17:18 */public class StackT {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubStack<Integer> data = new Stack<Integer>();Stack<Integer> min = new Stack<Integer>();StackWithMin<Integer> test = new StackWithMin<Integer>(data, min);test.push(new Integer(3));test.push(new Integer(5));test.push(new Integer(2));test.push(new Integer(6));test.pop();test.pop();System.out.println(test.min());}}

测试结果:

18 0
原创粉丝点击