实现思路:们需要一个辅助栈。每次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. JS 正则 获取URL参数

    function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  2. 【原】隐藏ultraGrid1指定列

    void uGrdAllFlight_InitializeRow(object sender, InitializeRowEventArgs e) { /***********TEST START** ...

  3. Js popup position which right under target item

    <div style="margin-left:600px;"> <div id="Span1" style="color:#eee ...

  4. 利用Google GCM发送push通知到Android客户端

    // 这个可以需要在google账号中申请,勾选gcm服务选项 $apiKey = 'AIzaSyC6h3ysrn2HDCBqONTo2vKIVVuktIFoxxx'; $headers = arra ...

  5. CR0,CR3寄存器

    驱动在hook系统函数的时候通常要将只读属性暂时的屏蔽掉,主要有三种方法 1.修改CR0寄存器的WP位,使只读属性失效(这是网上用的最多的方法),切忌使用完之后立马修改回来 2.只读的虚拟地址,通过C ...

  6. MySQL中bin-log使用

    操作命令:show binlog events ; reset master 删除所有的二进制日志 flush logs 产生一个新的binlog日志文件 show master logs; 或者 s ...

  7. 巧用九宫格以减少UI资源量

    UI资源量对资源包大小和内存的影响 UI资源具有以下特点: (1)UI资源几乎都是图片,而图片是最占资源量的资源类型之一. (2)Unity不支持外部压缩,即使在外部将一个10MB的图片压缩到只剩1M ...

  8. Sharepoint delegate control

    <?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://sch ...

  9. c#加密汇总【粘】

    方法一: SHA1[不可逆]     //须添加对System.Web的引用     using System.Web.Security;           ...           /// &l ...

  10. SAML - SSO(转)

    http://baike.baidu.com/view/758527.htm?fr=aladdin SAML即安全断言标记语言,英文全称是Security Assertion Markup Langu ...