/****************************************************************************************
*题目:包含min函数的栈
* 定义的栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)
*
* 我们可以借助一个辅助的栈来进行最小值的统计,我们的辅助栈的大小和我们的原来的栈大小一样,但是我们辅助栈的大小每次push的时候都是把当前最小的压入,
* 如果原来的栈获取到一个新的数比较大的话,我们压入一个和栈顶元素一样的数据进入辅助栈
*时间:2015年9月2日09:25:55
*文件:StackWithMin.java
*作者:cutter_point
****************************************************************************************/
package bishi.Offer50.y2015.m09.d02;
import java.util.*;
import org.junit.Test;
public class StackWithMin
{
private Stack<Integer> data; //保存我们的数据
private Stack<Integer> min; //用来保存当前栈中最小的数
public int min() throws Exception
{
if(data == null || min == null)
{
throw new Exception("数据不存在");
}//if
if(data.empty() || min.empty())
{
throw new Exception("栈为空");
}//if
return min.peek();
}
/**
* 弹出数据
* @throws Exception
*/
public void pop() throws Exception
{
if(data == null || min == null)
{
throw new Exception("数据不存在");
}//if
if(data.empty() || min.empty())
{
throw new Exception("栈为空");
}//if
min.pop();
data.pop();
}
/**
* 压入一个数据
* @param num
*/
public void push(int num)
{
if(data == null || min == null)
{
data = new Stack<Integer>();
min = new Stack<Integer>();
}
data.push(num);
if(min.size() == 0)
{
//如果当前的最小数不存在
min.push(num); //那么就把当前的这个数作为当前的最小数
}//if
else
{
//那么我们就把这个数和当前最小的数比较,小就压入,不然就压入当前最小的值
int temp = min.peek();
if(temp > num)
{
min.push(num);
}//if
else
{
//如果当前值比当前最小的值还大
min.push(temp);
}//else
}//else
}
@Test
public void test()
{
StackWithMin swm = new StackWithMin();
try
{
swm.push(12);swm.push(13);swm.push(15);swm.push(1);
swm.push(-8);swm.push(5);swm.push(0);swm.push(12);
swm.push(-8);swm.push(-8);swm.push(12);swm.push(12);
System.out.println(swm.min());
swm.pop();swm.pop();swm.pop();swm.pop();swm.pop();swm.pop();
swm.pop();swm.pop();
System.out.println(swm.min()); //1
} catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
}
}