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;
    }
};

 

 

 

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