思路:用一个栈去模拟出入栈的过程
比如,当前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;
}
};