实现思路:们需要一个辅助栈。每次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. Paxos算法

    Paxos算法是分布式系统中常用的一个保持系统一致性的算法,由美国计算机科学家Leslie B. Lamport提出.原文链接. 今天特意学习了一下Paxos的原理,为防忘记,记录下来.(看了的东西没 ...

  2. 韩顺平细说Servlet视频系列意外收获之用命令行编译带有包的java类解决方案

    命令行编译带有包的java类 在命令行编译这一块,基本上都是新手入门时了解一下,然后就直奔IDE而去.这样固然没错,就怕那些--.然后今天在视频中看到了这种方法,觉得可能会用到,所以就记录下来了,以备 ...

  3. shadow服务端、客户端配置流程

    服务端 系统环境 CentOS 7 64位,由于系统自带python,shadowsocks服务端我们选择python版,过程如下 yum install python-setuptools & ...

  4. 如何建立一个“绑定友好的”usercontrol--wpf

    如何建立一个"绑定友好的"usercontrol--wpf 这几天在打算将以前用winform写的工具程序重构到wpf,顺便学习理解看过的wpf的知识. 因为程序设计到一个Exce ...

  5. asp.net get server control id from javascript

    var WhateverValue = document.getElementById('<%= saveValue.ClientID %>').value

  6. pdf转chm的实现方法

    相比pdf, CHM电子书在Windows系统下不需要安装额外的浏览器即可进行阅读,其内容是基于浏览器的风格,更容易被用户所接受.而且, 具有更强大的功能配置,比如可提供强大的全文搜索.索引.书签等的 ...

  7. PHP MYSQL 数据库配置连接

    //配置文件 Config.php // 默认使用数据库配置 ***************************************** $Config['ConnectTag'] = 'de ...

  8. javascript实现URL不缓存的方法

    <script> document.write("<s"+"cript type='text/javascript' src='/js/test.js? ...

  9. J2EE中文乱码处理

    在JAVA WEB开发的过程中,经常会遇到中文乱码的情况,中文乱码主要是在浏览器与服务器交互传递数据的时候发生的.对于这个棘手的问题,我参考(韩顺平老师)视频将处理方法总结与此,供自己以及大家开发的时 ...

  10. nginx低版本不支持pathinfo模式,thinkphp针对此问题的解决办法

    将一个thinkphp项目从apache环境移到nginx1.2上,怎奈,nginx这个版本默认不支持pathinfo模式 首先,编辑nginx的虚拟主机配置文件 location ~ .*.(php ...