题意描述:定义栈的数据结构,请在该类型中实现一个能够找到栈最小元素的min函数。在该栈调用min、push、pop的时间复杂度都是O(1)
解题思路:引用数据栈和辅助栈解题,
入栈:数据栈中直接压入元素,当辅助栈空或者要压入的元素小于当前辅助栈栈顶元素时,辅助栈也压入该元素
出栈:在数据栈不空的前提下,如果辅助栈栈顶元素与数据栈栈顶元素相等,则都弹出;否则只弹出数据栈栈顶元素
得最小元素:直接返回辅助栈栈顶元素
图解过程如下:
import java.util.Scanner;
import java.util.Stack;
public class MinStack {
private Stack<Integer> dataStack = new Stack<>();
private Stack<Integer> minStack = new Stack<>();
public MinStack() {}
public void push(int x) {
dataStack.push(x);
//如果minStack()为空或者新元素比mniStack()当前栈顶元素小,则新元素进栈
if(minStack.empty() || ((!minStack.empty())&&x<=minStack.peek()))
minStack.push(x);
}
public void pop() {
if(!dataStack.empty()){
if(minStack.peek().equals(dataStack.peek()))
minStack.pop();
dataStack.pop();
}
}
public int top() {
return dataStack.peek();
}
public int getMin() {
//辅助栈栈顶存放的是栈中最小元素
return minStack.peek();
}
public static void main(String[] args) {
MinStack ms = new MinStack();
ms.push(-2);
ms.push(0);
ms.push(-3);
System.out.println(ms.getMin());
ms.pop();
System.out.println(ms.top());
System.out.println(ms.getMin());
}
}