輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、5是某棧的壓棧順序,序列4、5、3、2、1是該壓棧序列對應的乙個彈出序列,但4、3、5、1、2就不可能是該壓棧序列的彈出序列。
首先,可以在第乙個序列也就是壓棧順序中找第二個序列中第乙個元素,是4,因為第二個序列中第乙個元素是第乙個被彈出的,那麼在壓入順序中,被彈出資料之前的所有資料都被壓入了棧中且還沒有被彈出,也就是連續壓進去了1、2、3、4,然後彈出第乙個資料4;之後在第二個序列中往後的元素,是5,如果不是棧頂元素就在第乙個序列中從4開始往後找繼續壓入再彈出,再次往後取第二個序列中的元素,如果是棧頂元素就彈出,直到棧空且兩個序列都遍歷一遍為止,否則,如果棧不為空且兩個序列都遍歷過了,則說明第二個序列不是壓棧序列的彈出序列。
程式設計如下:
#include #include #include using namespace std;bool ispopseq(int *push_arr, int *pop_arr, size_t size) //判斷,如果輸入佇列全部壓完了但仍然沒有找到輸出佇列的的第乙個元素,就返回false if((!s.empty()) && (s.top() != pop_arr[pop_index])) return false; //當棧中的元素恰好就是輸出佇列的彈出順序時就不斷的彈出 while((!s.empty()) && (pop_arr[pop_index] == s.top())) } //正確返回的條件就是當輸入佇列和輸出佇列都遍歷完畢且棧為空時判斷完成 if((push_index == size) && (pop_index == size) && s.empty()) return true; else return false;}int main(); int pop_arr1 = ; int pop_arr2 = ; int pop_arr3 = ; size_t size = sizeof(push_arr)/sizeof(push_arr[0]); bool ret = ispopseq(push_arr, pop_arr1, size); cout<
執行程式:
從上面的陣列可以判斷結果分別為true,false,false。
《完》本文出自 「敲完**好睡覺zzz」 部落格,請務必保留此出處
22 棧的壓入 彈出序列
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。如果下乙個彈出的數字剛好是棧頂數字,...
Q22 棧的壓入 彈出序列
q 給定乙個入棧序列in和出棧序列out,判斷out是否是in的乙個可行 合法 的出棧序列。若當前棧頂的元素與當前out的元素不同,且還有未入棧的in元素,那麼繼續入棧新元素,否則 就表明,所有的入棧in元素都入棧了,該出棧的元素就是沒在棧頂出現,說明被 埋沒 了,是個錯誤的出棧順序。bool is...
棧的壓入彈出序列
題目 輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓棧序列,序列4,5,3,2,1是該棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。解答 可以用乙個輔助的棧來儲存入...