如何在O(1)時間復雜度內求棧中最小元素呢?可以使用兩個棧來實現該問題。
參考《Java程序員面試筆試寶典》的實現方法:使用兩個棧結構,一個棧(記為S1)用來存儲數據,另一個棧(記為S2)用來指示着棧S1的最小元素。元素入棧S1時,如果當前入棧的元素比棧S2中已有元素還小,則把該元素也入棧S2;出棧時,如果棧S1出棧的元素為當前棧的最小值(等於棧S2棧頂元素),則S2的棧頂元素也出棧,以保證S2棧頂元素始終指示着棧S1的最小值。
一種實現方式如下(Java版):
1 import java.util.Stack; 2 3 /** 4 * 使用兩個棧模擬一個棧,該棧可以在O(1)時間內獲取棧中最小元素 5 * @author JiaJoa 6 * 7 */ 8 public class GetMinEleFromStack { 9 10 public static void main(String[] args) { 11 Algorithm_MinFromStack ams = new Algorithm_MinFromStack(); 12 MyStack<Integer> ms = ams.new MyStack<Integer>(); 13 14 ms.push(3); 15 ms.push(1); 16 ms.push(2); 17 ms.push(1); 18 19 System.out.println(ms.pop()); 20 System.out.println(ms.pop()); 21 System.out.println(ms.pop()); 22 System.out.println(ms.getMin()); 23 } 24 25 public class MyStack<E>{ 26 Stack<E> s1 = null; 27 Stack<E> s2 = null; 28 29 public MyStack(){ 30 s1 = new Stack<E>(); 31 s2 = new Stack<E>(); 32 } 33 34 //判斷是否棧空 35 public boolean isEmpty(){ 36 return s1.isEmpty(); 37 } 38 39 //獲取棧中元素個數 40 public int size(){ 41 return s1.size(); 42 } 43 44 //入棧,棧s1保存所有數據,若棧s2為空,則元素直接入棧,否則先和s2中棧頂元素比較,若更小則入棧 45 public void push(E data){ 46 s1.push(data); 47 48 if(s2.isEmpty()) 49 s2.push(data); 50 else{ 51 if((int)data<=(int)s2.peek()) //注意替換該處的元素比較方法 52 s2.push(data); 53 } 54 } 55 56 //出棧,直接彈出s1棧頂元素,同時判斷彈出的元素和棧s2棧頂元素的大小,若等於則彈出s2的棧頂元素 57 public E pop(){ 58 E topData = s1.pop(); 59 if(topData.equals(s2.peek())) 60 s2.pop(); 61 return topData; 62 } 63 64 //獲取棧頂元素 65 public E peek(){ 66 return s1.peek(); 67 } 68 69 //獲取棧中的最小值 70 public E getMin(){ 71 if(s2.isEmpty()) 72 return null; 73 return s2.peek(); 74 } 75 } 76 }