思路:
设置一个A栈类,在A栈类中在声名另一个B栈类的对象,这个对象主要用于存储最小值的,每次当用A栈类的对象压入元素时同时也对B栈类的对象中的上一个比较后,也进行压入。A栈类的对象弹栈时,B栈类的对象也同时弹栈。这样A栈类中的min方法里只需要对B栈类的对象.peek( )就行了。
代码如下:
1.接口
1 public interface IStack<T>{ 2 3 //元素入栈 4 void push(T e); 5 6 //弹出栈顶 7 T pop(); 8 9 //查看栈顶元素 10 T peek(); 11 12 13 }
2.StackMin类
1 import java.util.EmptyStackException; 2 import java.util.LinkedList; 3 4 public class StackMin<T> extends LinkedList<T> implements IStack<T>{ 5 6 @Override 7 public void push(T e) { 8 super.addLast(e);; 9 } 10 11 12 13 14 @Override 15 public T pop() { 16 if(getSize()<=0) throw new EmptyStackException(); 17 T value=super.removeLast(); 18 return value; 19 20 } 21 22 @Override 23 public boolean isEmpty() { 24 25 return getSize()>0; 26 } 27 28 @Override 29 public T peek() { 30 if(getSize()<=0) throw new EmptyStackException(); 31 return super.getLast(); 32 } 33 34 public int getSize() 35 { 36 return super.size(); 37 } 38 39 40 41 }
3.MyStack类
1 import java.util.EmptyStackException; 2 import java.util.LinkedList; 3 4 public class MyStack<T> extends LinkedList<T> implements IStack<T>{ 5 StackMin<T> minnode=new StackMin<T>(); 6 7 @Override 8 public void push(T e) { 9 super.addLast(e);; 10 if(minnode.getSize()==0) 11 { 12 minnode.push(e); 13 }else { 14 if((int)minnode.peek()<(int)e) 15 { 16 minnode.push(minnode.peek()); 17 }else { 18 minnode.push(e); 19 } 20 21 } 22 23 24 } 25 26 @Override 27 public T pop() { 28 if(getSize()<=0) throw new EmptyStackException(); 29 T value=super.removeLast(); 30 minnode.pop(); 31 return value; 32 33 } 34 35 @Override 36 public boolean isEmpty() { 37 38 return getSize()>0; 39 } 40 41 @Override 42 public T peek() { 43 if(getSize()<=0) throw new EmptyStackException(); 44 return super.getLast(); 45 } 46 47 public int getSize() 48 { 49 return super.size(); 50 } 51 52 53 public int min() { 54 return (int) minnode.peek(); 55 } 56 57 58 }