某搜尋公司實習面試的時候有這麼一道題,當時沒答對,《劍指offer》一書裡面也詳細講解了,自己再總結消化一遍
棧和佇列是資料結構的基本概念
棧(stack)是指一種先入後出(first in last out)的資料結構,在現實中通俗的例子是乙個只有上面有入口的貨倉,先放進去的貨物落在最底下,後放進去的貨物在最表層,所以後放入的貨物可以先取出,先放入的貨物要等後放入的貨物取完後才能輪得到
棧對應的操作是入棧(push)和出棧(pop),入棧相當於存入貨物,出棧相當於取出貨物
在程式底層實現中,棧用來儲存區域性的變數,比如,c/c++的函式輸入引數是乙個傳值得過程,可以用objdump之類的反彙編工具看看c函式的彙編**。引數列表的前幾個引數通常可以儲存在通用暫存器,如果引數很多,比如乙個函式有十多個輸入引數,那麼沒有這麼多暫存器資源儲存,這時就需要棧來完成。具體就是函式會先分配乙個一定大小的記憶體空間作為棧,將暫存器無法儲存的引數列表函式的返回位址等入棧,函式內部計算過程中如果沒有足夠的暫存器,區域性資料也是儲存在棧裡面。函式的棧空間有一定的大小限制,具體大小不太記得,比如在函式中定義乙個很大很大的陣列,執行的時候會報錯,自己當時經歷過這個問題,可以做個試驗驗證下。
乙個棧用作存數乙個棧用作取數,就稱為入隊棧和出隊棧
如果兩個棧都空了,則佇列是空
例子:
至此入隊的四個數1,2,3,4也按順序依次出隊1,2,3,4
兩個棧實現佇列 兩個佇列實現棧
1.兩個棧實現佇列 大致思路 入佇列時,將元素入棧s1,出佇列時,將s2中的元素出棧即可,如果s2為空,那麼將s1中 s1.size 1 個元素出棧,加入到s2中,然後將s1中最後乙個元素出棧,即完成了出佇列的操作 include using namespace std include includ...
兩個棧實現佇列,兩個佇列實現棧
include include include using namespace std 使用兩個棧實現佇列,實現了push,pop,front操作 其中棧s2是輔助棧,push直接在s1中插入 pop從s2中出棧,如果s2是空的,將s1倒進s2,然後再出棧,這樣減少了倒棧次數,比較高效。front就...
兩個棧實現佇列 兩個佇列實現棧
一 題目描述 用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。二 1 自己 基本思路 乙個棧用於壓縮,乙個專門用於彈出。因為棧是先進後出,所有的元素入棧再出棧,再入棧就可以將順序調整過來。但是沒有想到優化。class solution int pop int tem...