一、题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
二、思路解析
首先定义一个Integer类型的栈,记为stack,此栈用来完成数据正常的push()、pop()、top()和peek()等操作。
然后定义一个Integer类型的栈,记为minStack(一定要理解清楚此栈的作用),此栈主要用来记录每一次stack进行push、pop、top和peek等操作后stack栈中的最小元素,所以stack的每一次push或者pop操作后,都需要对minStack进行更新处理,以保证minStack能够及时记录stack当前元素中的最小值(stack和minStack需要进行同步操作,也即stack有元素入栈时候,minStack也要入栈一个特殊的元素(以更新stack中新的最小值);stack出栈时候,minStack也要出栈(以更新记录stack中新的最小值))。简单说,minStack就是实时记录stack中最小元素值,为了保证实时记录的任务,minStack对于stack的push和pop操作需要作出相应的操作。
1、stack入栈时候,minStack需要进行的操作
(1)如果入栈元素node比minStack栈顶元素小(此处没有讨论stack为空的情况,如果stack为空,则stack和minStack都入栈node元素)
则在stack入栈后,把入栈元素node也加入到minStack栈顶(保证minStack记录stack当前所有元素中的最小值)
(2)如果入栈元素node比minStack栈顶元大
此情况说明入栈node后stack中最小值没有变,最小值还是入栈前的最小值,所以node不应该加入到minStack的栈顶,但是minStack仍然需要入栈一个元素,这个元素的大小等于minStack的栈顶元素,如下代码中所示:“minStack.push(minStack.peek());”。这个比较容易忽略,其实只要想一想minStack的作用就很容易理解。
2、stack出栈时候,minStack需要进行的操作
stack出栈时,minStack也要出栈,以更新对stack最小值的记录。
3、过程模拟
(1)假设stack连续入栈元素为5,3,6,4,2,3,1,则minStack中先后入栈元素为5,3,3,3,2,2,1。
(2)在(1)基础上,假设stack先后出栈1,3,2,则minStack先后出栈1,2,2。
三、java代码
public class Solution {
Stack<Integer> stack = new Stack();
Stack<Integer> minStack = new Stack();
public void push(int node) {
if(stack.empty()){
stack.push(node);
minStack.push(node);
}else{
stack.push(node);
if(node < minStack.peek()){
minStack.push(node);
}else{
minStack.push(minStack.peek());
}
}
}
public void pop() {
stack.pop();
minStack.pop();
}
public int top() {
return stack.peek();
}
public int min() {
return minStack.peek();
}
}
以上均为个人理解,如果不正确、不合理或者可以优化的地方,欢迎下方留言。