數據結構-劍指offer-棧的壓入、彈出序列

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

        彈出序列根據序列1,2,3,4,5的入棧出棧順序而有所變化。所以判斷一個序列是否是彈出序列,就是要判斷該序列可否通過原始序列的不斷入棧出棧而形成:如果下一個彈出的數字剛好是棧頂數字,那麼直接彈出;如果下一個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂爲止;如果所有數字都壓入棧後仍然沒有找到下一個彈出的數字,那麼該序列就不可能是一個彈出序列。

思路:模擬堆棧操作:將原數列依次壓棧,棧頂元素與所給出棧隊列相比,如果相同則出棧,
                                             如果不同則繼續壓棧,直到原數列中所有數字壓棧完畢。

                                             檢測棧中是否爲空,若空,說明出棧隊列可由原數列進行棧操作得到。否則,說明出棧隊列不能由原數列                                       進行棧操作得到。

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty() || popV.empty() || pushV.size()!=popV.size())
            return false;
        stack<int> stackData;
        int j=0;
        for(int i=0;i<pushV.size();++i){
            stackData.push(pushV[i]);
            while(!stackData.empty() && stackData.top()==popV[j]){
                stackData.pop();
                ++j;
            }
        }
        if(stackData.empty())
            return true;
        return false;
    }
};

或者更簡練的大神的寫法:

class Solution {
public:
    bool IsPopOrder(vector<int> pushV,vector<int> popV) {
        if(pushV.empty() || popV.empty() || pushV.size()!=popV.size())
            return false;
        stack<int> stackData;
        for(int i=0,j=0;i<pushV.size();){
            stackData.push(pushV[i++]);
            while(j<popV.size() && stackData.top() == popV[j]){
                stackData.pop();
                j++;
            }
        }
        return stackData.empty();
    }
};
問題:i++與++i對結果並沒有影響????why
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章