題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否爲該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
彈出序列根據序列1,2,3,4,5的入棧出棧順序而有所變化。所以判斷一個序列是否是彈出序列,就是要判斷該序列可否通過原始序列的不斷入棧出棧而形成:如果下一個彈出的數字剛好是棧頂數字,那麼直接彈出;如果下一個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂爲止;如果所有數字都壓入棧後仍然沒有找到下一個彈出的數字,那麼該序列就不可能是一個彈出序列。
思路:模擬堆棧操作:將原數列依次壓棧,棧頂元素與所給出棧隊列相比,如果相同則出棧,
如果不同則繼續壓棧,直到原數列中所有數字壓棧完畢。
檢測棧中是否爲空,若空,說明出棧隊列可由原數列進行棧操作得到。否則,說明出棧隊列不能由原數列 進行棧操作得到。
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.empty() || popV.empty() || pushV.size()!=popV.size())
return false;
stack<int> stackData;
int j=0;
for(int i=0;i<pushV.size();++i){
stackData.push(pushV[i]);
while(!stackData.empty() && stackData.top()==popV[j]){
stackData.pop();
++j;
}
}
if(stackData.empty())
return true;
return false;
}
};
或者更簡練的大神的寫法:
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(pushV.empty() || popV.empty() || pushV.size()!=popV.size())
return false;
stack<int> stackData;
for(int i=0,j=0;i<pushV.size();){
stackData.push(pushV[i++]);
while(j<popV.size() && stackData.top() == popV[j]){
stackData.pop();
j++;
}
}
return stackData.empty();
}
};
問題:i++與++i對結果並沒有影響????why