棧和佇列的相互實現

2021-08-09 16:20:56 字數 2270 閱讀 8181

棧和佇列作為兩種典型的線性表,有著非常鮮明甚至可以說是相互對立的特點;棧先進後出(後進先出),佇列先進先出(後進後出)。因此,對相同的輸入,兩者會產生恰好截然相反的輸出。例如,對於給定的序列」abcde」,如果按照字母順序將這個5個元素依次入棧,然後再依次出棧,那麼得到的輸出將是」edcba」,而如果將5個元素意思壓入佇列,然後依次彈出,那麼得到的輸出將是」abcde」。

正是因為這種截然相對的輸出,使得他們彼此之間有了更多的聯絡;使得他們之間可以相互實現對方。就是說我們可以用棧模擬出佇列的輸出,同樣也可以用佇列模擬出棧的輸出。下面就來看看。

現在有棧stack1和棧stack2,假設現在輸入序列」abcde」已經依次壓入到棧stack1,a處於棧底,e處於棧頂,那麼怎樣才可以得到輸出序列也為「abcde」呢,我們很容易想到,把棧stack1倒過來就可以了,那麼怎樣倒過來呢?這時候就要借助stack2,我們把stack1的內容依次彈出,然後再依次壓入到stack2不就相當於把stack1 倒過來了嗎?這時候stack2 依次彈出,輸出序列就是佇列形式了。總結一下:

原理很簡單,實現起來也不難:

/**

* created by engineer on 2017/10/22.

* * 用棧實現佇列

*/public

class

stack2queue

public

intgetsize()

private

boolean

enqueue(e e)

private e dequeue()

if (mtstackb.isempty())

}return mtstackb.pop();}}

//測試類

public

static

void

main(string args)

}}

得到輸出:

出對列:a

出佇列:b

3 個元素出隊:bc

d

有了上面的經驗,我們可以再想想怎樣用兩個佇列實現棧呢?其實,思路或者說是原理,都是一樣,就是利用兩個容器,實現資料的翻轉,假設現有佇列dequea和dequeb;剛開始兩個佇列都為空,現有輸入序列」abcde」,有元素a要入隊,那麼這個時候,可以隨機乙個佇列使用,假設我們選佇列dequeb,元素a進入佇列dequeb,接著元素b,c,d進入佇列dequeb,這個時候,如果要求有元素輸出,如果直接從佇列dequeb頭部輸出元素,那麼就不符合棧後進先出的原則,此時,需要輸出的元素是d,而他此時在佇列dequeb的尾部,因此為了輸出他,必須把他前面的abc**拿走**,拿走的元素放在**呢?佇列dequea恰好是空的,放進去就好了。此時,佇列dequeb中只有乙個b,讓他出佇列就好了,最後佇列dequeb空了。接著e要入隊,此時他應該放在**呢?應該放入佇列dequea中。同樣,此時需要輸出了,再次按照剛才的思路,把佇列dequea 中除了e之外的所有元素放入佇列dequeb中,這樣以此類推,就實現了棧的輸出。總結一下:

按照上面的思路:

/**

* created by engineer on 2017/10/22.

* * 佇列實現棧

*/public

class

queue2stack

private

intgetsize()

private

void

push(e e) else

}private e pop() throws exception

if (mequeuea.isempty() && !mequeueb.isempty()) else

if (mequeueb.isempty() && !mequeuea.isempty()) else

}private e swapdeque(dequea, dequeb)

//從佇列b隊頭返回最後的乙個元素

return b.removefirst();}}

public

static

void

main(string args) throws exception

}}

得到輸出:

棧頂元素pop:b

棧頂元素pop:d

4 個元素出棧:

第 1 個出棧元素:e

第 2 個出棧元素:c

第 3 個出棧元素:b

第 4 個出棧元素:a

好了,這就是棧和佇列的相互實現。

棧和佇列相互實現

題目一 佇列實現棧 要求 使用佇列實現棧的下列操作 push x pop top empty 方法 利用雙佇列deque實現棧,操作方便,效率較高 思路 1 push 操作,為了保證先進棧的元素一直在棧底,需要將兩個佇列交替使用,才可滿足需求,所以我們在空的佇列新增元素,然後將非空佇列的元素全部追加...

棧和佇列的相互實現

兩個棧實現佇列 解題思路 佇列是先進先出,有隊頭和隊尾,因此用第乙個棧的棧頂表示隊頭,第二個表示隊尾。佇列插入的時候是從尾巴插入,因此代表尾部的棧可以定義成乙個插入棧也是隊尾棧。佇列輸出遵守先進先出原則,輸出的元素是隊頭,因此代表頭部的棧可以定義乙個輸出棧也叫隊頭棧。為避免佇列順序錯亂,因此兩個棧在...

225 232 棧和佇列相互實現

解題思想 佇列的特點是先進先出,用兩個佇列相互資料轉移,實現棧的先進後出。以pop為例,佇列1先進棧,如果要實現出棧,則將佇列1中的元素除了最後乙個元素轉移到佇列2中,再將佇列1中元素移除,實現出棧,下一步繼續入棧,再從佇列2轉移到佇列1.時間複雜度 o n 空間複雜度o 2 n 兩個佇列 解題思想...