2011-10-01 85 views
1

我將它作爲一個數組實現,兩個堆棧彼此相鄰,但是它們的頂端都在兩端。也就是說,如果top(stack1)位於鍵的開始處,則top(stack2)位於鍵的結尾處。底部(堆疊1)和底部(堆疊2)應該相鄰,但是頂部(堆疊1)和頂部(堆疊2)之間的任何位置。爲了刪除,我從Top(Stack1)彈出,並且爲了插入,我在Top(stack2)中推送。有人可以告訴我這樣做是否正確?使用兩個堆棧的隊列

當我閱讀CLRS時,我以這種方式解決了這個問題,並且無法知道它是否是ryt。但是它在今天的考試中被問到,後來每個人都在討論正式的方式(這裏和網絡上的其他地方),所以看起來我是唯一這樣做的人。我真的很想知道這是錯的還是對的?請幫助

回答

1

隊列和堆棧是具有定義良好的行爲的抽象數據結構,並且這些數據結構的任何實現都應遵守此合同。

使用單個數組來實現兩個堆棧的想法很好。但是,插入和刪除應該發生在兩個堆棧上。

例如,比方說你有這個設置

2 3 4 5 6

頂部(棧1)是2
底部(棧1)是4
頂部(stack2中)爲6
底部(stack2中)是5

後從堆棧中彈出1次3次,您將達到堆棧的底部即4,即使中還有兩個元素也不能再彈出任何東西實施。所以,需要對您的實施進行一些更正。因此,如果我要實現兩個模擬QUEUE的堆棧,這就是我將如何做到的。

棧12 3 4 5 6這實質上是一個數組
2是堆棧的底部和6是堆棧的頂部。

stack2中empty

插入元素到隊列:
這是非常簡單的。只需添加到陣列末尾即stack1
stack12 3 4 5 6 7
現在7是堆棧的頂部。在棧1
1.流行的所有元素,並將它們插入到stack2中:

從隊列中刪除的元素。所以,你的陣列將得到扭轉
棧1empty
stack2中7 6 5 4 3 2。現在2位於堆棧的頂部。
2.現在你的頂部(stack2中)將指向2。只需彈出它。 7 6 5 4 3
3.現在從stack2中在stack2中,流行剩餘的元素,並將其插入到棧1。
stack2中empty
棧13 4 5 6 7

PS:以上算法假定你知道如何來爲數組的內存管理,因爲它可以收縮或擴張。

+0

thanx的d答案張貼在這裏。儘管我沒有在關於bottom(Stack1)或Bottom(Stack2)的答案中的算法中指定。我只是把條件如果(Top1 <= Top2)刪除和如果(Top2

+0

Raymond,請使用正確的英文。這是一個英文論壇,而不是加密英文論壇。 –

+1

@AI Kepp:我沒有得到你。哪些線路是cryptoenglish? –

0

我想到你居然可以實現使用兩個鄰近的堆疊像你描述的隊列。問題是你不能有效地實現與數組相鄰的兩個堆棧。我的意思是你的隊列看起來不錯,但是當你嘗試使用底層棧時,你遇到了如何在數組的開頭插入一個新項目的問題(即push到stack1)。您需要移動(複製)數組中的所有項目以將項目推入堆棧1。這是不健康的設計。

+0

就是這樣。我決定在最後插入並在數組開始時刪除。因爲這是一個隊列的工作方式,對嗎?在不同的末端插入和刪除。我使用堆棧1的彈出屬性和堆棧2的Push屬性,使數組表現爲隊列。 –

0

對於那些誰正在尋找解決方案,樣品一個是這樣的:

比方說,我們有兩個stacksS1S2
queue具有給定的兩種行爲:

  1. 排隊:將一個元素到隊列中。爲此,只需推入S1即可。
  2. 出列:通過一個從S1一個彈出的所有元素,同時將它們推入S2。現在從S2彈出。彈出的元素是Dequeue的理想結果。鼓勵

讀者找到更優化的解決方案,這一點,如果可能的話:)