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. django 报错 no such table: auth_user

    需要执行 python3 manage.py makemigrations python3 manage.py migrate 参考:http://arrayoverflow.com/question ...

  2. Linux System Programming 学习笔记(五) 进程管理

    1. 进程是unix系统中两个最重要的基础抽象之一(另一个是文件) A process is a running program A thread is the unit of activity in ...

  3. FZOJ 2102 Solve equation

                                                                                                        ...

  4. Filter里面实现未登录跳转,已登录权限判断

    package com.erichfund.cljjfof.server.util; import java.io.IOException; /** * @author 作者 zhuzhengquan ...

  5. P1473 校门外的树3

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述  校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……如今学校决定在某个时刻在某一段种上一 ...

  6. WebRTC入门学习之初识WebRTC (转)

    一.WebRTC基本架构 图一  WebRTC总体架构,摘自百度百科 先说说WebRTC大致的实现思路:我们创建的web app,然后在app中调用W3C提供的JS API,JS API 会调用浏览器 ...

  7. echarts 金字塔

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. Classical method of machine learning

    PCA principal components analysis kmeans bayes spectral clustering svm EM hidden Markov models deep ...

  9. Spring Boot中使用AOP记录请求日志

    这周看别人写的springboot后端代码中有使用AOP记录请求日志,以前没接触过,因此学习下. 一.AOP简介 AOP为Aspect Oriented Programming的缩写,意为:面向切面编 ...

  10. 【matlab】:matlab中不断的出现计算过程怎么办

    这个问题是会常常性出的.就是matlab中不断的出现计算. 关于这个问题,我们须要考虑的是自己是不是写错了,通常会出现以下两种可能的错误 1,关于计算的函数没有写分号 :这样的是致命问题,假设函数不写 ...