參考文章
棧和佇列都是用來儲存資料的,無論底層是使用陣列還是鍊錶來實現,其基本原理是不變的,那就是棧的特點的先進後出,佇列的特點是先進先出。
size()
enqueue()
dequeue()
peek()
使用佇列來實現棧
使用佇列來實現棧的方式其實和通過棧實現佇列的方式差不多。用以上方法也是可以的。但是,為了讓大家更好的掌握這兩種資料結構,再給大家提供另外一種思路。
上面的佇列實現中。插入方法並沒有額外的操作,只是在彈出的時候需要做些額度的處理。那麼另外乙個思路就是在插入的時候做些事情,這樣在彈出的時候就可以無須額外操作直接彈出了。同樣,還是需要兩個佇列來實現棧。具體如何操作呢?
先來定義一下這個棧:
class mystack
還是通過一張圖,看下使用佇列實現的棧是如何進行元素的插入的。
從上圖中可以看出,用來實現棧的兩個佇列是不區分用途的,也就是說兩個佇列都具備插入和彈出的功能。之所以可以這麼做的原因就是,他要保證任何時候都只有乙個佇列中有元素。
上圖的插入操作,插入h的時候,兩個佇列都為空,優先選擇從queue1插入。 當想要插入o的時候,由於queue1中已經包含了資料,那麼就講o插入queue2中,然後再將queue1中的資料依次插入queue2。實現**如下:
void push(int
x) if (a.empty())
}else }}
再來一張圖,看看如何使用兩個佇列來實現棧的彈出操作。
由於我們在插入的時候,保證了兩個佇列中只有乙個佇列包含資料,並且資料的順序已經調整好了(包含資料的那個佇列的佇列頭就是整個棧的棧頂),那麼就直接從有資料的那個佇列中往外彈資料就可以了。實現**如下:
int
pop()
else
}
好了,至此,我們已經完成了使用兩個棧實現佇列和兩個佇列實現棧的功能的介紹。總結一下,主要有兩種方案。拿通過棧來實現佇列舉例。
方案一:定義兩個棧,乙個專門用來插入,乙個專門用來彈出。插入操作只會插入到插入棧。彈出的時候,優先從彈出棧往外彈,如果彈出棧中的內容為空,那麼就將插入棧中的資料依次彈出,並壓入彈出棧,然後再彈出。
方案二:定義兩個棧,不區分作用,但是有乙個原則就是始終要保證其中乙個棧為空。每次插入的時候先將待插入資料直接插入到空的棧中,然後再將另外乙個棧中的資料依次彈出,並壓入這個剛剛插入新資料的棧中。彈出的時候,只要從那個有資料的棧中往外彈資料就可以了。
無論以上哪種方案,其實根本原理都是和我們小時候玩的漢諾塔遊戲差不多。
兩個棧實現佇列 兩個佇列實現棧
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...