思路:用一個棧去模擬出入棧的過程
比如,當前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;
}
};