演算法 兩個棧實現佇列

2021-08-06 03:54:05 字數 1638 閱讀 4220

題目:

template

class cqueue

;

解題思路:首先這個題目要完成兩個棧實現佇列,其次還涉及到c++類和模板的一些知識,先說前面:

我們知道,棧是一種後入先出的結構,而佇列恰恰相反,是一種先入先出的結構,需要用棧實現佇列,這意味著我們有現成的push和pop可以用,以實現入隊和出隊。

現在有兩個棧stack1和stack2,我們向stack1依次壓入a,b,c三個值,stack2為空:

此時出棧的話,順序為c,b,a,但是出隊的順序應該是a,b,c,為了實現想要的出隊順序,我們可以把stack1裡面的內容依次壓入stack2中:

此時再將stack2內的內容做出棧,將彈出a:

下面討論再次入隊的情況,將d壓入stack1,此時兩個棧的情況:

此時出隊的話,在stack2中還有值的話,直接出棧stack2,彈出b,c。此時stack2中已經沒有值了,需要再次從stack1中出棧到stack2中入棧,然後再次stack2的出棧,彈出d。這與佇列的出隊形式完全相同:

我們可以根據上面的實驗整理出乙個程式設計思路,如果stack2中沒有值,就做stack1到stack2的壓棧,如果有就做stack2的出棧,而不管stack1有沒有值都可以做入棧。

下面需要考慮的是c++的模板,使用模板的目的就是能夠編寫與型別無關的**,在上面例子中使用了a,b,c,d,那麼在例項化物件時t就行該是char,比如例項化乙個叫做queue的物件:

cqueue queue;
**實現

template

cqueue::~cqueue(void)

template

template

t cqueue::deletehead()

}if(stack2.size() == 0)

throw

new exception("queue is empty");

t head = stack2.top();

stack2.pop();

return head;

}

兩個棧實現佇列 兩個佇列實現棧

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...