【劍指Offer】面試題22:棧的壓入,彈出序列

一:題目描述

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


二:解題思路

解決這個問題,就根據題目模擬棧的入棧和出棧的過程

如入棧順序1,2,3,4,5   出棧的順序4,5,3,2,1


藉助一個輔助棧,模擬入棧和出棧的過程

1,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同

2,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同

3,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同

4,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同

                              4出棧,出棧順序當前元素爲5,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同

5,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同

                              5出棧,出棧順序當前元素爲3,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同

                              3出棧,出棧順序當前元素爲2,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同

                              2出棧,出棧順序當前元素爲1,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同

                              1出棧,出棧順序當前元素爲X,棧空

棧空同時與出棧順序全部比較完成,返回true


綜上:解決該問題需要一個輔助棧,按照第一個序列中的數字依次壓入該輔助棧,並按照第二個序列的順序依次從棧中彈出數字

                              


三:代碼實現

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        
        if(pushV.size()==0 && popV.size()==0)
            return true;
        if(pushV.size()!=popV.size())
            return false;
        
        stack<int> data;
        
        int i;//pushV
        int j=0;//popV
        
        //按照壓棧順序,依次將元素壓入棧中
        for(i=0;i<pushV.size();i++){
            
            data.push(pushV[i]);
            
            //如果棧頂元素與出棧序列元素相同,則出棧
            while(!data.empty() && j<popV.size() && data.top()==popV[j]){
                j++;
                data.pop();
            }
        }
        
        if(data.empty() && j==popV.size())
            return true;
        else
            return false;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章