劍指offer-棧的壓入、彈出序列

0 題目

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)blog

1 分析

這個題目,或是固定的題目,就採用模擬以便壓棧,彈棧的過程來作。class

入棧順序,按順序依次入棧。每次入棧後,都判斷棧頂元素是否和出棧順序的是否一致。若是一致那麼先彈出棧頂元素,再次比較。直到棧頂元素和出棧順序不一致。循環

當出棧順序遍歷完之後,棧不爲空,且不能按照出棧順序彈出了。那麼表示不多是一個彈棧順序。遍歷

bool IsPopOrder(vector<int> p, vector<int> q)
{
    if (p.size() == 0)
    {
        return true;
    }
    stack<int> st;
    
    // j表示出棧順序的第幾個
    int j = 0;

    for (int i = 0; i < p.size(); ++i)
    {
        // 模擬入棧
        st.push(p[i]);

        // 入棧完之後判斷 q[j]是否等於棧頂元素。須要循環判斷
        while (!st.empty() && q[j] == st.top())
        {
            // 相等就彈出
            st.pop();
            ++j;
        }
    }
    // 到最後,st中應該爲空。由於正好 j = size-1;
    return st.empty();
}
相關文章
相關標籤/搜索