最小栈问题
问题概述:
获取一个栈中最小的元素
问题本质:
栈的灵活运用
思路:
对于一个栈,采用标记位的方法记录栈中的最小值。如果新入栈的元素小于当前栈中保存的最小值,就将栈的最小值替换为新入栈的元素。注意需要考虑出栈的情况,如果当前最小值出栈,那么当前最小值的前一个最小值应该为当前栈的最小值。故:需要将栈的最小值的标记位修改为一个辅助栈,存储栈中的所有最小值。
例图分析:
package algorithm;
import java.util.Iterator;
public class MinStack<T extends Comparable<T>> {
//主栈
private Node MainStack;
//存储最小值的辅助栈
private Node MinStack;
private int N;
private class Node{
private T element;
private Node next;
public Node(T element, Node next) {
this.element = element;
this.next = next;
}
}
public MinStack(){
MainStack = new Node(null,null);
MinStack = new Node(null,null);
}
public void push(T element){
Node NewNode = new Node(element,null);
NewNode.next = MainStack.next;
MainStack.next = NewNode;
N++;
//如果辅助栈为空,或当前栈内最小值大于新入栈元素
if(MinStackisEmpty() || getmin().compareTo(element)>0){
Node MinNode = new Node(element,null);
MinNode.next = MinStack.next;
MinStack.next = MinNode;
}
}
private Boolean MinStackisEmpty(){
return MinStack.next==null;
}
public T pop(){
Node node = MainStack.next;
MainStack.next = node.next;
if(node.element == MinStack.next.element){
MinStack.next = MinStack.next.next;
}
return node.element;
}
public T getmin(){
return MinStack.next.element;
}
public static void main(String[] args) {
MinStack<String> stack = new MinStack<>();
stack.push("E");
stack.push("F");
stack.push("G");
stack.push("D");
System.out.println(stack.getmin());
stack.pop();
System.out.println(stack.getmin());
}
}