合理的出棧順序也是面試算法經常考察的一部分,堆棧(stack)的后進先出性質我們都了解。如果給定了一個入棧的序列,判斷一個序列是否為合理的出棧順序該如何進行呢。
例如,我們給定了入棧順序為 1,2,3,4,5
那么【序列1】3,2,5,4,1 是合理的;
【序列2】3,1,2,4,5 就是不合理的出棧順序
我們這里思考幾個問題:
(1)錯誤的出棧順序不會出現的原因;
(2)合法的出棧順序有什么規律?是否可以結合棧和隊列的性質來實現?
(3)嘗試設計一個時間復雜度為O(n)的算法,其中n是序列的長度。
於是我們的設計思路如下:
同時使用一個隊列order和一個堆棧s來解決該問題,其中,order存儲待判斷的出棧序列,而s用於模擬序列中每個元素的入棧和出棧過程。
這里按照1-n的順序將每個元素壓入棧s:
每次壓入一個元素,檢查棧頂元素與隊列頭元素是否相同,若相同,s與order同時執行pop操作。
若最終棧s為空,說明order里存放的序列是合理的出棧順序,否則就是不合理的出棧序列。
具體代碼如下:
1 bool check_is_valid_order(std::queue<int> order) { 2 std::stack<int> s; 3 int n = order.size(); 4 for (int i = 1; i <= n; i++) 5 { 6 s.push(i); 7 while (!s.empty() && s.top()==order.front()) 8 { 9 s.pop(); 10 order.pop(); 11 } 12 } 13 if (!s.empty()) 14 { 15 return false; 16 } 17 return true; 18 }