這是面試的時候碰到了一個問題,今天整理下思路,實現的程式碼整理好之後會放在文末。
問題的關鍵點在於順序,佇列是先進先出的,棧是後進先出的,也就是先進後出。所以他們的放入順序相同,取出順序是完全相反的。 另外還需要注意,佇列的取出存入操作,不會改變佇列中元素的放置順序,而棧取出再存入,會將棧中元素的排序倒置。
兩個佇列實現一個棧
因為佇列是先進先出的,所以佇列的末尾元素就是棧要取出的首元素。
- 首先判斷兩個佇列是否都為空,若為空,將所有元素放入佇列1(當然,佇列2也可以)。若不為空,將所有元素放入非空佇列中。
- 進行出棧操作時,將非空佇列的元素放入依次放入空佇列中,將最後的尾元素保留並取出。
兩個棧實現一個佇列
因為棧是先進後出(後進先出)的,所以棧的末尾元素就是棧要取出的首元素。
- 首先判斷兩個棧是否為空,若為空,將所有元素放入棧1(當然,棧2也可以)。
- 此時,我們需要取出元素時,將棧1的元素全部放入棧2中,因為棧的後進先出的特點,由棧1出棧元素放入棧2後,棧2的出棧操作順序即為佇列元素的取出順序。所以,可以將使用棧1負責新增元素,棧2負責取出元素。每次棧2為空時,將棧1元素全部放入棧2,繼續取出操作即可。
最後
在進行操作的時候,我們需要保證操作的安全性,所以兩個佇列或者兩個棧,要是執行緒安全的。