leetcode-946 驗證棧序列

思路:用一個棧去模擬出入棧的過程

       比如,當前pushed={1,2,3,4,5},popped={4,5,3,2,1}時,藉助一個額外的棧s,置i=0,j=0(i指向pushed,j指向popped); popped[j]=4,所以先將,1,2,3壓入棧s中,此時i指向了pushed中的4,j指向了popped中的4,它倆相同,所以可以不用入棧,相當於

4入棧以後直接出棧了。此時i,j繼續後移,i指向pushed中的5,j指向了popped中的5。由於他們相同,直接遞增i,j;相當於5入棧之後馬上出棧。

       此時會退出第一個大的while循環,開始逐個比較棧頂元素和popped[j]是否相同即可。

     注意:

特殊情況:第一種,pushed={1,2,3,4,5},popped={1,2,3,4,5}時,相當於每個元素都是壓棧後馬上彈出,所以在while中棧s沒有壓入任何元素,返回true即可。

               第二種,pushed={1,2,3,4,5},popped={3,2,1,4,5}。s中壓入1,2後,i指向3,j指向3。此時遞增i,j。i指向4,j指向2,此時j所指的2與棧頂元素2相同,所以s.pop(),j後移,此時j指向1,又與新的棧頂1相同。繼續s.pop(),j後移。

class Solution {
public:
    bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
       stack<int> s;
       int i=0,j=0;
        while(i<pushed.size()){
            while(i<pushed.size()&&pushed[i]!=popped[j])
                s.push(pushed[i++]);
            while(i<pushed.size()&&pushed[i]==popped[j])
                ++i,++j;//pushed[i]==popped[j]時,直接跳過,相當於popped[j]壓入棧後馬上彈出
            while(!s.empty()&&s.top()==popped[j])
                s.pop(),++j;//壓入一些元素,然後中間彈出,比如pushed={2,1,0},popped={1,2,0}
        }
        while(!s.empty()){
            if(s.top()!=popped[j])
                return false;
            else
                s.pop(),++j;
        }
        return true;
    }
};

 

 

 

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