一:題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
二:解題思路
解決這個問題,就根據題目模擬棧的入棧和出棧的過程
如入棧順序1,2,3,4,5 出棧的順序4,5,3,2,1
藉助一個輔助棧,模擬入棧和出棧的過程
1,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同
2,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同
3,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同
4,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同
4出棧,出棧順序當前元素爲5,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,不同
5,入棧,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同
5出棧,出棧順序當前元素爲3,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同
3出棧,出棧順序當前元素爲2,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同
2出棧,出棧順序當前元素爲1,棧非空,判斷棧頂元素是否與出棧順序當前元素相同,相同
1出棧,出棧順序當前元素爲X,棧空
棧空同時與出棧順序全部比較完成,返回true
綜上:解決該問題需要一個輔助棧,按照第一個序列中的數字依次壓入該輔助棧,並按照第二個序列的順序依次從棧中彈出數字
三:代碼實現
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.size()==0 && popV.size()==0)
return true;
if(pushV.size()!=popV.size())
return false;
stack<int> data;
int i;//pushV
int j=0;//popV
//按照壓棧順序,依次將元素壓入棧中
for(i=0;i<pushV.size();i++){
data.push(pushV[i]);
//如果棧頂元素與出棧序列元素相同,則出棧
while(!data.empty() && j<popV.size() && data.top()==popV[j]){
j++;
data.pop();
}
}
if(data.empty() && j==popV.size())
return true;
else
return false;
}
};