package com.example.lettcode.offer;
import java.util.Stack;
/**
* @Class MinStack
* @Description 剑指offer 30 包含min 函数的栈
* 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,
* 调用 min、push 及 pop 的时间复杂度都是 O(1)。
* 示例:
* MinStack minStack = new MinStack();
* minStack.push(-2);
* minStack.push(0);
* minStack.push(-3);
* minStack.min(); --> 返回 -3.
* minStack.pop();
* minStack.top(); --> 返回 0.
* minStack.min(); --> 返回 -2.
* @Author
* @Date 2020/7/17
**/
public class MinStack {
// 保存入栈的元素
public Stack<Integer> data;
// 保存最小元素
public Stack<Integer> min;
/**
* initialize your data structure here.
*/
public MinStack() {
data = new Stack<>();
min = new Stack<>();
}
/** 定义两个stack,一个为存放最小数的序列的辅助栈。
* 压栈时,先将元素 x 压入 stack1。然后判断 stack2 的情况:
* stack2 栈为空或者栈顶元素大于 x,则将 x 压入 stack2 中。
* stack2 栈不为空且栈定元素小于 x,则重复压入栈顶元素。
* 获取最小元素时,从 stack2 中获取栈顶元素即可。
**/
public void push(int x) {
// min 栈保存的一直是date栈中入栈时的最小元素,两个栈的个数相同
// add是继承自Vector的方法,且返回值类型是boolean。
// push是Stack自身的方法,返回值类型是参数类类型。
data.push(x);
if (min.size() == 0 || min.peek() > x) {
min.push(x);
}else {
min.push(min.peek());
}
}
public void pop() {
// pop()函数返回栈顶的元素,并且将该栈顶元素出栈。
data.pop();
min.pop();
}
public int top() {
// peek()函数返回栈顶的元素,但不弹出该栈顶元素。
return data.peek();
}
public int min() {
return min.peek();
}
}
// 测试用例
public static void main(String[] args) {
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
System.out.println(minStack.min());
minStack.pop();
System.out.println(minStack.top());
System.out.println(minStack.min());
}