棧和佇列的相互實現

2021-10-09 03:09:46 字數 3996 閱讀 3566

兩個棧實現佇列

解題思路:

佇列是先進先出,有隊頭和隊尾,因此用第乙個棧的棧頂表示隊頭,第二個表示隊尾。

佇列插入的時候是從尾巴插入,因此代表尾部的棧可以定義成乙個插入棧也是隊尾棧。

佇列輸出遵守先進先出原則,輸出的元素是隊頭,因此代表頭部的棧可以定義乙個輸出棧也叫隊頭棧。

為避免佇列順序錯亂,因此兩個棧在做插入或者輸出時應該保持另乙個棧為空

如上圖:當要插入時所有元素放入第乙個棧棧頂為隊尾插入即插入佇列尾部,取出隊頭的時候將第乙個棧所有元素分別放入第二個棧中棧頂就為隊頭取出棧頂就為隊頭,兩個棧相互轉換分別執行自己的功能就實現了先進先出和從尾部輸入的功能。

如上圖:當第二個棧不為空的時候插入佇列變成6 1 2 3 4 5違背了佇列插入在尾部的原則,當第乙個棧不為空的時候取出隊頭元素佇列變為6 2 3 4 5 違背了取出隊頭的原則,因此在做相應操作時,另乙個棧應該為空。

**實現:

建立乙個佇列類它包含兩個棧。並通過兩個棧實現他的相關函式。

#pragma once

#include

using

namespace std;

class

cqueue

;

bool cqueue::

empty()

else

return

false;}

void cqueue::

push

(const

int& val)

else

m_push.

push

(val)

;}

}int

& cqueue::

back()

else

return m_push.

top();

}}int& cqueue::

front()

else

return m_printf.

top();

}}void cqueue::

pop(

)//刪除隊頭

else

m_printf.

pop();

}}int cqueue::

size()

下面為檢驗相關函式功能**:

#include

#include

"queue.h"

using

namespace std;

intmain()

cout << qu.

back()

<< endl;

//輸出隊尾元素

cout << qu.

size()

<< endl;

//輸出大小

while

(!qu.

empty()

)//判斷隊是否為空

return0;

}

輸出結果

上面結果顯示**正確

兩個佇列實現棧

解題思路:

條件:建立兩個空佇列q1和q2,q1用於儲存棧中元素,q2用於在pop()和top()操作時候臨時存放q1的元素。

出棧pop:先判斷佇列q1元素數目是否為1,若為一,直接彈出並刪除即可;若多於1,則將q1中元素彈出並加入q2直至q1剩餘乙個元素,將其刪除,然後將q2暫存的元素彈出並壓入q1即可

入棧push:直接將元素加入q1的尾部即可

**實現:

建立乙個棧類,它包含兩個佇列。並通過兩個佇列實現他的相關函式。這裡寫成模板類。

#include

#include

using

namespace std;

template

<

class

t>

class

queuetostack

public

://判斷為空

bool

empty()

else

}//刪除

void

pop(

)//刪除第二個佇列的棧底

m_que2.

pop();

}else

//刪除第乙個佇列的棧底

m_que1.

pop();

}--m_size;

}

}//返回棧頂

t top()

else}}

//新增元素

void

push

(const t& val)

else

m_size++;}

//返回棧的大小

intsize()

};

測試程式:

int

main()

return0;

}

結果如下:

小隊成員(wu_0526,qq_49032326,ly1196324806,samgeren,qq_39124199,teeeee_)

兩個棧實現佇列解題思路:佇列是先進先出,有隊頭和隊尾,因此用第乙個棧的棧頂表示隊頭,第二個表示隊尾。

佇列插入的時候是從尾巴插入,因此代表尾部的棧可以定義成乙個插入棧也是隊尾棧。

佇列輸出遵守先進先出原則,輸出的元素是隊頭,因此代表頭部的棧可以定義乙個輸出棧也叫隊頭棧。

為避免佇列順序錯亂,因此兩個棧在做插入或者輸出時應該保持另乙個棧為空

如上圖:當要插入時所有元素放入第乙個棧棧頂為隊尾插入即插入佇列尾部,取出隊頭的時候將第乙個棧所有元素分別放入第二個棧中棧頂就為隊頭取出棧頂就為隊頭,兩個棧相互轉換分別執行自己的功能就實現了先進先出和從尾部輸入的功能。

如上圖:當第二個棧不為空的時候插入佇列變成6 1 2 3 4 5違背了佇列插入在尾部的原則,當第乙個棧不為空的時候取出隊頭元素佇列變為6 2 3 4 5 違背了取出隊頭的原則,因此在做相應操作時,另乙個棧應該為空。

**實現:

建立乙個佇列類它包含兩個棧。並通過兩個棧實現他的相關函式。

#pragma once

#include

using

namespace std;

class

cqueue

;

bool cqueue::

empty()

else

return

false;}

void cqueue::

push

(const

int& val)

else

m_push.

push

(val)

;}

棧和佇列相互實現

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

棧和佇列的相互實現

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

225 232 棧和佇列相互實現

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