棧的輸出佇列

2021-07-10 10:58:38 字數 1469 閱讀 7068

題目描述

輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的乙個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。

我的看法:

乙個比較直觀的方法就是,用乙個輔助棧模擬彈出棧的過程。

比如說,順序壓入序列一時,當棧頂元素為4時,則彈出4,接著壓入5,此時與輔助棧棧頂元素5相同,則彈出5。沒有元素可壓時,按照上述條件,一次處理,直到為空。這樣就可以確定結果了。

**:

bool ispoporder(vector

pushv,vector

popv)

}while(!s.empty() && popv[j] == s.top() )

return s.empty();

}

然而,有沒有更好的方法呢?

這裡的討論是基於序列的下標,為了便於討論,從1開始。

假如有 個數入棧,下標為1,2,3

那麼輸出序列有:

1 2 3

1 3 2

2 1 3

2 3 1

3 2 1

然而,3 1 2 卻是不可以的。

同理,還可以模擬一下4 個數入棧的結果,你會發現

3 1 ……

4 2 ……

等序列是不可以的。

因為當 3 彈出的時候,後面跟著的是2 1

發現規律沒有。

那麼總結如下:

直到序列遞減大於1時,如果後續序列嚴格遞減,則ok,否則no。其他情況都ok。

那問題又來了,假如我想輸出所有的出棧序列呢?

很明顯,先對下標進行全排列,然後去除不符合以上條件的序列即可。

那怎麼生成全排列?嗯,自己查演算法。

另外乙個方法就是使用遞迴。

詳見參考資料。

**如下:

void playstack(int a, int index, int len ,vector

& stk, vector

& que)

); for(int i = stk.size()-1;i>=0;--i)

cout

<" ";

cout

}stk.push_back(a[index]);

playstack(a, index+1, len, stk, que);

stk.pop_back();

if(!stk.empty())

}void play(int a, int len)

參考資料:

給一串數字,輸出所有的出棧序列 - lzshlzsh的專欄

棧的佇列(佇列)

二.關於佇列的簡單實現。順序佇列的基本實現和順序棧的實現基本相似。順序佇列在出列和入列的時候會使佇列整體向上移動,會浪費一定的空間。因此出現了一種佇列叫做迴圈佇列。迴圈佇列可以實現空間的重複利用,大大節省了空間。關於迴圈佇列的實現 建立乙個空佇列 struct node struct node in...

棧與佇列 建立棧 佇列

陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...

佇列實現棧棧實現佇列

佇列是一種先進先出的資料結構,要想實現先進後出,需加乙個輔助佇列進行資料的來回倒 引用交換 從而實現棧結構。例如 5 4 3 2 1 用乙個輔助佇列裝 4 3 2 1,把5彈出,在把 4 3 2 1放回原佇列,如此反覆可變成5 4 3 2 1的棧結構。棧是一種先進後出的資料結構,要想實現先進先出,同...