实现思路:们需要一个辅助栈。每次push一个新元素的时候,同时将最小元素(或最小元素的位置。考虑到栈元素的类型可能是复杂的数据结构,用最小元素的位置将能减少空间消耗)push到辅助栈中;每次pop一个元素出栈的时候,同时pop辅助栈。
 
测试用例:
1)功能测试(输入的两个数组含有多个数字或者只有1个数字,第二个数组是或者不是第一个数组表示的压入序列对应的栈的弹出序列);
2)特殊输入测试(输入两个null指针)

代码实现:
栈实现类:
package com.yyq;

import java.util.Comparator;
import java.util.EmptyStackException;
import java.util.Stack; /**
* Created by Administrator on 2015/9/16.
*/
public class StackWithMin<T extends Comparable<T>> {
private Stack<T> m_data = new Stack<T>(); // 数据栈,存放栈的所有元素
private Stack<T> m_min = new Stack<T>(); //辅助栈,存放栈的最小元素 public void push(T value){
// 把新元素添加到辅助栈
m_data.push(value);
// 当新元素比之前的最小元素小时,把新元素插入辅助栈里;
// 否则把之前的最小元素重复插入辅助栈里
if (m_min.size() == 0){
m_min.push(value);
}else{
if (value.compareTo(m_min.peek()) <= 0){
m_min.push(value);
}else {
m_min.push(m_min.peek());
}
}
} public T min(){
if (m_min.size() <= 0)
return null;
return m_min.peek();
} public void pop(){
if (m_data.size() > 0 && m_min.size() > 0){
m_data.pop();
m_min.pop();
}else{
throw new EmptyStackException(); // return null
}
}
}

实现类:

package com.yyq;

import java.util.ArrayList;

/**
* Created by Administrator on 2015/9/16.
*/
public class MinInStack<T> {
public static void main(String[] args) {
System.out.println("Test1");
StackWithMin<Integer> newStack1 = new StackWithMin<Integer>();
newStack1.push(4);
newStack1.push(6);
newStack1.push(2);
newStack1.push(5);
newStack1.pop();
newStack1.pop();
newStack1.push(1);
System.out.println(newStack1.min()); System.out.println("Test2");
StackWithMin<Integer> newStack2 = new StackWithMin<Integer>();
newStack2.push(3);
System.out.println(newStack2.min()); System.out.println("Test3");
StackWithMin<Integer> newStack3 = new StackWithMin<Integer>();
System.out.println(newStack3.min()); System.out.println("Test4");
StackWithMin<Integer> newStack4 = new StackWithMin<Integer>();
newStack4.push(7);
newStack4.push(6);
newStack4.push(5);
System.out.println(newStack4.min()); System.out.println("Test5");
StackWithMin<Integer> newStack5 = new StackWithMin<Integer>();
newStack5.push(1);
newStack5.push(2);
newStack5.push(3);
System.out.println(newStack5.min()); System.out.println("Test6");
StackWithMin<Integer> newStack6 = new StackWithMin<Integer>();
newStack6.push(1);
newStack6.push(2);
newStack6.push(3);
newStack6.pop();
newStack6.pop();
newStack6.pop();
System.out.println(newStack6.min());
}
}
 
结果输出:
Test1
1
Test2
3
Test3
null
Test4
5
Test5
1
Test6
null

P132、面试题21:包含min函数的栈的更多相关文章

  1. 《剑指offer》面试题21 包含min函数的栈 Java版

    (min函数的作用是返回栈内最小值) 首先这个栈要具有普通栈所具有的push()和pop()方法,那么内部一定包含一个Stack.至于还要能实现min函数,而且还是在O(1)时间复杂度内,我们不得不考 ...

  2. 剑指Offer:面试题21——包含min函数的栈(java实现)

    问题描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数.在该栈中,调用min,push及pop的时间复杂度都是O(1). 思路:加入一个辅助栈用来存储最小值集合 (这里要注 ...

  3. 剑指offer-面试题21.包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ...

  4. 《剑指offer》面试题21—包含min函数的栈

    题目:定义栈数据结构,并在该数据结构中实现一个能获得栈最小元素的函数min.要求push,min,pop时间都是O(1). 思路:要用一个辅助栈,每次有新元素压栈时辅助栈压入当前最小元素:min函数直 ...

  5. 题目21 包含Min函数的栈

    ///////////////////////////////////////////////////////////////////////////////////// // 3. 题目21  包含 ...

  6. 21 包含min函数的栈

    定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. C++: class Solution { private: stack<int> dataStack ; stac ...

  7. 《剑指offer》面试题30. 包含min函数的栈

    问题描述 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).   示例: MinStack minSt ...

  8. 剑指offer面试题30.包含min函数的栈

    一开始写的垃圾代码,push和pop都是O(N) class Solution { public: vector<int> vec; int min_val=INT_MAX,min_cnt ...

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

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

  10. 21:包含min函数的栈

    import java.util.Stack; /** * 面试题21:包含min函数的栈 * 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. */ public class ...

随机推荐

  1. a2x

    #include <typeinfo> template <typename T> bool a2x( T& _f , char* p) { if( !p ) retu ...

  2. 开启Windows的索引服务

    除开SearchEverything电脑内部的全硬盘搜索之外,如果要搜索文件内的内容的话,就无能为力的了.Window内置的索引服务就派上用场了,这么好的服务,默认设置居然是关闭的,想不通. 下面来介 ...

  3. 普通树(有根树)C++

    对于普通树实现的细节包括 1 树结点的结构体 2 初始化及删除树结点(关注内存泄露) 3 递归先序遍历 4 通过关键值的查询操作,返回关键值的结点 5 凹入表实现 6 广义表实现 7 非递归先序遍历, ...

  4. 在使用masm32 rc编译资源文件.rc出现的问题

    fatal error RC1004: unexpected end of file found 很蛋疼.然来是.h宏定义文件中.最后一行加个回车键即可.否则就提示这错误.

  5. 分布式之高性能IO组件

    因为毕业设计(实时分析大型数据流),开始对分布式并行计算做研究,第一个问题就是通讯.高性能的通讯是整个系统性能的基本保障. 方案 就目前的经验来讲,最好的通信选择是:异步非阻塞IO + 资源池. 异步 ...

  6. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...

  7. 教您如何使用MySQL group_concat函数

    MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...

  8. Winform 异步更新listbox

    public partial class Form1 : Form { private BackgroundWorker bw; public Form1() { InitializeComponen ...

  9. 我的WebX框架学习总结与心得分享

    最近学习了webx框架, 利用博客园跟大家分享一下自己的学习心得; 周建旭 2014-08-21 网上关于webx的资料少的可怜, 怎么办?  这种情况下不用去求助别人求人只会耽误时间, 不用畏惧; ...

  10. 分布式日志收集系统--Chukwa

    1. 安装部署 1.1 环境要求 1.使用的JDK的版本必须是1.6或者更高版本,本实例中使用的是JDK1.6 2.使用的hadoop的版本必须是Hadoop0.20.205.1及以上版本,本实例中使 ...