題目描述
輸入兩個整數序列,第乙個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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然而,3 1 2 卻是不可以的。1 3 2
2 1 3
2 3 1
3 2 1
同理,還可以模擬一下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的棧結構。棧是一種先進後出的資料結構,要想實現先進先出,同...