判斷一個序列是否為合理的出棧順序


合理的出棧順序也是面試算法經常考察的一部分,堆棧(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 }

 


免責聲明!

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



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