分析:借助辅助栈,遍历出栈序列的时候,每一个元素要么在辅助栈的栈顶,要么还没有入栈,这时从入栈序列中找到这个值,并把它前面的元素全部入栈,这时它作为栈顶,符合出栈序列,如果遍历结束入栈序列还未找到这个值,那么出栈序列不符合要求,返回false。
注意防御性编程,当两个序列为空指针时的情况,长度不同的情况等等
注意第22行的条件,调试的时候出错。
//设置辅助栈 创建两个指针,分别指向压栈和弹栈序列
class Solution {
private:
stack<int>st;
public:
Solution()
{
while(!st.empty()) st.pop();
}
~Solution()
{
}
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
//防御性编程
int len1 = pushV.size(),len2 = popV.size();
if(len1<=0||len2<=0||len1!=len2) return false;
int i=0,j=0;
while(j<len2)
{
//首先判断弹栈序列当前值是否在栈顶
if(!st.empty()&&popV[j]==st.top()) {
st.pop();
j++;
continue;
}
//如果不在栈顶,那么要到压栈序列中找到这个值,把它之前的值全部入栈,把它作为栈顶元素
bool flag = false;
while(i<len1)
{
st.push(pushV[i]);
if(pushV[i]==popV[j]) {
flag = true;
break;
}
i++;
}
if(!flag) return false;
st.pop();
i++,j++;
}
return true;
}
};