分析:藉助輔助棧,遍歷出棧序列的時候,每一個元素要麼在輔助棧的棧頂,要麼還沒有入棧,這時從入棧序列中找到這個值,並把它前面的元素全部入棧,這時它作爲棧頂,符合出棧序列,如果遍歷結束入棧序列還未找到這個值,那麼出棧序列不符合要求,返回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;
}
};