【笔试】38、包含min函数的栈

本文介绍了一种特殊栈的设计方案,该栈除了具备常规的push和pop操作外,还提供了一个min函数用于返回栈中当前的最小元素,并确保所有操作的时间复杂度均为O(1)。通过使用辅助栈来跟踪最小值,文章详细阐述了如何实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/****************************************************************************************
 *题目:包含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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值