实现思路:们需要一个辅助栈。每次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. mysql 之路目录

    数据库介绍.常见分类 Mysql入门 Mysql安装配置 Mysql多实例安装配置 Mysql常用基本命令 Mysql数据库备份和恢复 Mysql日志 Mysql逻辑.物理备份和增量恢复 Mysql字 ...

  2. PHP 类的静态变量索引

    直接上代码 <?php class example{ public static $pa; public $pb; public function __construct(){ $this-&g ...

  3. spring 计划任务:cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...

  4. JQuery 解决 鼠标快速滑过后,会执行多次滑出的问题

    如果用slideToggle,鼠标快速滑过后,滑进滑出很多次,要解决这个问题,用stop(false,true) $(".Nav_L").hover(function () { $ ...

  5. html 模板 swig 预编译插件 grunt-swig-precompile

    GitHub grunt-swig-precompile NPM grunt-swig-precompile 在书写前端静态页面的时候,每个页面总在书写很多重复的标签. 为了提高效率,结合 swig. ...

  6. ADO和ADO.NET的区别

    1. ADO与ADO.NET简介 ADO与ADO.NET既有相似也有区别,他们都能够编写对数据库服务器中的数据进行访问和操作的应用程序,并且易于使用.高速度.低内存支出和占用磁盘空间较少,支持用于建立 ...

  7. Session_set_save_handler 之 文本模式实现

    1.构建session抽象类,实现Session_set_save_hanlder函数必须的基础函数 <?php /* 实现session利用文件形式或者数据库等其它形式进行存储操作 * aut ...

  8. EXTJS 4.2 资料 控件之Grid Columns 列renderer 绑定事件

    columns: [ { header: '序号', xtype: 'rownumberer', align: 'center', width: 100 }, { header: 'CompanyId ...

  9. 域名的a记录转过来他的公网ip

    首先 客户要我把域名 和项目进行绑定客户需要提供万网或者新网的账户,登进去域名管理  选项域名管理的A记录定向到那个公网ip上 与服务器做绑定然后 在服务器的iis 上 加个主机头 输入主机头名称 也 ...

  10. unity手游之聊天SDK集成与使用一

    手游中都有聊天功能,比如公会,私聊,世界聊天,那么找一个好用,功能强大的SDK的可以节省很多精力,帮助我们提高开发速度与游戏质量. 写本篇博文是为了方便使用这个SDK做聊天模块的程序,避免许多坑,我在 ...