算法要求
定义栈的数据结构,请再该类型中实现一个能够得到栈的最小元素的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// 表示此时栈中已经没有数据了