前提摘要
先從彈出序列入手,獲取中途彈出的元素(即彈出序列中排在前面的元素),不把這些中途彈出的元素壓入棧,其它元素按照壓入序列的次序進(jìn)棧。若遇到某次彈出多個(gè)元素則需將元素出棧。當(dāng)所有元素進(jìn)棧完成后,比較彈出序列后面的元素是否和出棧次序相同。
排除
若入棧完成后未找到與彈出序列相同的元素則返回false
若出棧過(guò)程中彈出序列已經(jīng)遍歷完或中途不相同則返回false
bool isPushAndPoP(int in[],int out[],int n){
if(in==NULL || out == NULL || n<=0 ) return false;
stack<int> sData;
int i,j=0;
for(i=0;i<n;i++){
while(in[j]!=out[i]){
sData.push(in[j++]);
if(j==n) return false; //no same element in in[]
}
//at this moment in[j]==out[i]
int k=j-1;
while(k>=0 && in[k]==out[i+1]){
sData.pop();
k--;i++;
}
if(++j==n) break;
}
while(!sData.empty()){
if(out[++i]!=sData.top() || i==n) return false;
sData.pop();
}
return true;
}
上面思維比較混亂,實(shí)際上關(guān)鍵在遍歷彈出序列,比較當(dāng)前元素和棧頂元素即可:
1.相等,則應(yīng)出棧
2.不相等,則棧里繼續(xù)壓入元素
反思
1、沒(méi)有利用好棧頂元素,只想著減少進(jìn)出棧操作
2、沒(méi)有耐心畫(huà)圖,將問(wèn)題具體化