剑指offer-包含min函数的栈

算法要求

定义栈的数据结构,请再该类型中实现一个能够得到栈的最小元素的min函数,在该栈中,调用min、push及pop的时间复杂度都是O(1)。

思路

定义两个栈 datastack 和 minstack。datastack,用户记录存储入栈操作的数据;minstack,用于记录每次存入栈中此时栈中最小的栈的元素,此最小值位于栈顶
比如,现在入栈3,4,2,1。分析此时两个栈种元素的变化,已经出栈1,2,4,3之后,每一次出栈中两个栈中的变化情况。
3入栈datastack,minstack中没有元素,3是最小的,直接入栈
4入栈datastack,minstack中此时最小值3,3 < 4 。故此时minstack中再入栈3,表示minstack中元素是3,3
2入栈datastack,minstack中此时栈顶最小值是3,此时2 < 3 ,所以2入栈,此时minstack栈中元素是3,3,2
1入栈datastack,minstack中此时栈顶最小值是2,此时1 < 2,所以1 入栈,此时minstack栈中元素是3,3,2,1
此时datastack依次出栈时,minstack也依次出栈。minstack中的栈顶元素,表示的是此时datastack中最小值的元素

操作流程形如:
在这里插入图片描述

代码实现

package com.offer.test;

import java.util.Stack;

/**  
 * 包含min函数的栈
 * @author zhouwenchen@021.com  
 * @date 2019年6月20日 上午10:39:53 
 */
public class StackWithMin {

	private static Stack<Integer> data = new Stack<Integer>();
	private static Stack<Integer> min = new Stack<Integer>();

	/**
	 * 入栈操作
	 */
	public static void stackWithMinPush(int value) {
		data.push(value);
		if (min.size() == 0 || value < min.peek()) {
			min.push(value);
		} else {
			min.push(min.peek());
		}
	}

	/**
	 * 出栈操作
	 * @param value
	 */
	public static void stackWithMinPop() {
		if (data.size() > 0 && min.size() > 0) {
			data.pop();
			min.pop();
		}
	}

	/**
	 * data栈的栈顶元素
	 * @return
	 */
	public static int stackWithDataTop() {
		if (data.size() > 0) {
			return data.peek();
		}
		return 0;
	}

	/**
	 * min栈的栈顶元素,栈顶元素为data栈中现有元素的最小元素
	 */
	public static int stackWithMinMin() {
		if (data.size() > 0 && min.size() > 0) {
			return min.peek();
		}
		return 0;
	}

	public static void main(String[] args) {
		stackWithMinPush(3);
		System.out.println("入栈中值是:3");
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPush(4);
		System.out.println("入栈中值是:4");
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPush(2);
		System.out.println("入栈中值是:2");
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPush(1);
		System.out.println("入栈中值是:1");
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		
		System.out.println("此时开始出栈操作");
		stackWithMinPop();
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPop();
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPop();
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		stackWithMinPop();
		System.out.println("栈中此时最小值是:" + stackWithMinMin());
		
	}
}

执行结果

入栈中值是:3
栈中此时最小值是:3
入栈中值是:4
栈中此时最小值是:3
入栈中值是:2
栈中此时最小值是:2
入栈中值是:1
栈中此时最小值是:1
此时开始出栈操作
栈中此时最小值是:2
栈中此时最小值是:3
栈中此时最小值是:3
栈中此时最小值是:0// 表示此时栈中已经没有数据了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值