在O(1)時間復雜度內求棧中最小元素


如何在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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM