3.设计包括 min 函数的栈。

定义栈的数据结构,要求加入一个 min 函数。可以得到栈的最小元素。

要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。





思路分析:

a.要想一个在栈中找出栈的最小值,且时间复杂度为1,我们可能回忆到每次向栈插入push()一个值都对其进行排序操作,将最小值放在栈顶,可是我们非常快会发现这样的方式破坏了栈的结构,不再满足栈的先进先出的特点了(FIFO),此法不行

b.通过一个成员函数来保存最新值,但当最小元素弹出栈pop()时,我们无法得到次小元素,所以此法也不行。

c.大家可能立刻想到用数组了。通过数组来保存对栈进行插入或删除后栈中的最小值,但这有一个弊端,我们不知道要给数组申请大多的地址空间,由于我们事先无法确定会插入多少个数到栈中,此法不优

d.我们能够使用一个辅助栈来存放最小值

操作:

option dataStack栈 minStack栈
push(3) 3 3
push(5) 3,5 3,3
push(2) 3,5,2 3,3,2
push(6) 3,5,2,6 3,3,2,2
pop() 3,5,2 3,3,2
pop() 3,5 3,3

minStack就是我们的辅助栈,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;
} @Override
public E push(E item) {
// TODO Auto-generated method stub if(data.size()==0||item.compareTo(min.peek())<0){
min.push(item);
}else{
min.push(min.peek());
}
data.push(item);
return super.push(item);
} @Override
public synchronized E pop() {
// TODO Auto-generated method stub
if(!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 stub Stack<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());
}
}

測试结果:

面试题三:设计包括 min 函数的栈。的更多相关文章

  1. 【剑指Offer学习】【面试题21:包括min 函数的栈】

    题目: 定义栈的数据结构,请在该类型中实现一个可以得到栈的最小素的min 函数.在该栈中.调用min.push 及pop的时间复杂度都是0(1) 解题思路: 把每次的最小元素(之前的最小元素和新压入战 ...

  2. 【编程题目】设计包含 min 函数的栈

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

  3. 【面试题021】包含min函数的栈

    [面试题021]包含min函数的栈  MinStack.cpp: 1234567891011121314151617181920212223242526272829303132333435363738 ...

  4. 面试经典-设计包含min函数的栈

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

  5. 剑指offer——面试题30:包含min函数的栈

    #include"iostream" #include"stdio.h" using namespace std; ; ; template<typena ...

  6. 面试题21:包含min函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:google的一道面试题.我看到这道题目时,第一反应就是每次p ...

  7. 剑指Offer面试题:19.包含Min函数的栈

    一.题目:包含Min函数的栈 题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min.push及pop的时间复杂度都是O(1). 这里我们要实现的就是min ...

  8. 面试题之堆栈队列系列一:设计包含min函数的栈

    编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...

  9. 设计包含min()函数的栈

    题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是去年google的一道面试题. 我看到这道题目时,第一反应 ...

随机推荐

  1. fullpage在vue单页面当中使用会出现的问题以及解决办法

    在 vue 单页面当中发现fullpage会报错,报错信息大概意思为,fullpage不允许初始化多次. 解决办法,在使用fullpage的组件跳转路由进入销毁组件之前的生命周期的时候对fullpag ...

  2. UVa1362 Exploring Pyramids

    区间dp,枚举走完第一个子树之后回到根节点的位置. /*by SilverN*/ #include<algorithm> #include<iostream> #include ...

  3. 52深入理解C指针之---不透明指针

    该系列文章源于<深入理解C指针>的阅读与理解,由于本人的见识和知识的欠缺可能有误,还望大家批评指教.一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:s ...

  4. linux sleep函数

    应用程序: #include usleep(n) //n微秒 Sleep(n)//n毫秒 sleep(n)//n秒 驱动程序: #include mdelay(n) //milliseconds 其实 ...

  5. 对于Redux的理解

    在移动端项目,经常会在不同view中进行传递数据,事件.当事件比较少时,我们可以通过常规的事件流方法,注册,发布事件 进行响应等等.但是项目中一个事件多处响应时候,就会使程序变得相当复杂.在现在的Vu ...

  6. hdu 1796(容斥原理+状态压缩)

    How many integers can you find Time Limit: 12000/5000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. 数据库SQL Server 2014 设置自动备份(维护计划和作业)

    前言     1.SQL Server数据库自动备份可以有两种操作          第一种是在SQL控制台下的服务器名称展开,展开“管理”--选择“维护计划”,右键“新建维护计划”即可.       ...

  8. python安装numpy和matplotlib

    1.从该链接下载对应的whl文件 2.按照下面的方式从whl文件安装即可 windows7 python2.7 1.用管理员方式打开cmd 2.首先通过pip命令安装wheel 如果提示’pip’不是 ...

  9. Java并发容器,底层原理深入分析

    ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...

  10. Cef应用程序结构

    Application Structure 应用程序结构 Every CEF3 application has the same general structure. Provide an entry ...