您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關c#如何實現棧的壓入、彈出序列,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1、2、3、4、5是某棧的壓棧順序,序列4、5、3、2、1是該壓棧序列對應的一個彈出序列,但4、3、5、1、2就不可能是該壓棧序列的彈出序列。
首先,可以在第一個序列也就是壓棧順序中找第二個序列中第一個元素,是4,因為第二個序列中第一個元素是第一個被彈出的,那么在壓入順序中,被彈出數據之前的所有數據都被壓入了棧中且還沒有被彈出,也就是連續壓進去了1、2、3、4,然后彈出第一個數據4;之后在第二個序列中往后的元素,是5,如果不是棧頂元素就在第一個序列中從4開始往后找繼續壓入再彈出,再次往后取第二個序列中的元素,如果是棧頂元素就彈出,直到棧空且兩個序列都遍歷一遍為止,否則,如果棧不為空且兩個序列都遍歷過了,則說明第二個序列不是壓棧序列的彈出序列。
程序設計如下:
#include <iostream> #include <stack> #include <assert.h> using namespace std; bool IsPopSeq(int *push_arr, int *pop_arr, size_t size) { assert(push_arr && pop_arr && size);//判斷參數的有效性 stack<int> s; size_t push_index = 0; size_t pop_index = 0; while(pop_index < size) { //將輸入隊列中處于輸出隊列第一個元素之前的所有元素都壓入棧內 while(push_index < size) { s.push(push_arr[push_index]); ++push_index; if(s.top() == pop_arr[pop_index]) break; } //判斷,如果輸入隊列全部壓完了但仍然沒有找到輸出隊列的的第一個元素,就返回false if((!s.empty()) && (s.top() != pop_arr[pop_index])) return false; //當棧中的元素恰好就是輸出隊列的彈出順序時就不斷的彈出 while((!s.empty()) && (pop_arr[pop_index] == s.top())) { s.pop(); ++pop_index; } } //正確返回的條件就是當輸入隊列和輸出隊列都遍歷完畢且棧為空時判斷完成 if((push_index == size) && (pop_index == size) && s.empty()) return true; else return false; } int main() { int push_arr[] = {1, 2, 3, 4, 5}; int pop_arr1[] = {4, 5, 3, 2, 1}; int pop_arr2[] = {4, 3, 5, 1, 2}; int pop_arr3[] = {2, 5, 3, 4, 1}; size_t size = sizeof(push_arr)/sizeof(push_arr[0]); bool ret = IsPopSeq(push_arr, pop_arr1, size); cout<<ret<<endl; ret = IsPopSeq(push_arr, pop_arr2, size); cout<<ret<<endl; ret = IsPopSeq(push_arr, pop_arr3, size); cout<<ret<<endl; return 0; }
運行程序:
從上面的數組可以判斷結果分別為true,false,false。
《完》
關于“c#如何實現棧的壓入、彈出序列”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。