題目:輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。例如序列1,2, 3, 4,5是某棧的壓棧序列,序列4,5,3,2,1是該壓棧序列的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
演算法思想:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下乙個彈出的數字不在棧頂,我們把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下乙個需要彈出的數字壓入棧頂為止。如果所有的數字都壓入棧了仍然沒有找到下乙個彈出 的數字,那麼該序列不可能是乙個彈出序列。
下面我們以4,5,3,2,1為例分析壓棧和彈出的過程。第乙個希望被彈出的數字是4,因此4需要先壓入到輔助棧中。壓入棧的順序由壓棧序列確定了,也就是在把4壓入棧之前,數字1,2, 3都需要先壓入棧中。此時棧裡包含4個數字:1,2,3, 4,其中4位於棧頂。把4彈出棧後,剩下的三個數字是1,2,3。接下來希望被彈出的數字是5,由於它不是棧頂數字,因此我們接著在第乙個序列中把4以後數字壓入輔助棧中,直到壓入了數字5。這個時候5位於棧頂,就可以被彈出來了。接下來希望被彈出的三個數字依次是3,2,1.由於每次操作前它們都位於棧頂,因此直接彈出即可。
bool ispoporder(const
int* ppush,const
int* ppop,int nlength)
//否則,繼續往裡面壓入元素
stackdata.push(*pnextpush);
++pnextpush;
}//進棧序列元素已經進棧,仍然沒有找到與出棧序列棧頂元素相同的元素
if(stackdata.top()!=*pnextpop)//不一致
stackdata.pop();//元素一致,輔助棧彈出元素
++pnextpop;
}if(stackdata.empty() && pnextpop-ppop==nlength)//所有元素出棧完
}return bpossible;
}
棧的壓入彈出序列
題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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是該壓棧序列對應的乙個彈出序列,但4 3 5 1 2就不可能是該壓棧序列的彈出序列。bool ispoporder cons...
棧的壓入彈出序列
1.問題描述 輸入兩個整數序列,第乙個序列表示棧的壓入序列,請判斷第二個序列是否為該棧的彈出序列。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列4,5,3,2,1是該棧序列對應的乙個彈出序列,但 4,3,5,1,2,就不可能是該壓棧序列的彈出序列。來自 劍指offer...