C 兩個佇列實現棧

2021-07-05 16:28:48 字數 1667 閱讀 8514

佇列是先進先出容器,而棧是先進後出容器。

1. 設棧中有兩個佇列,分別為m_queue1和m_queue2.

2. 首先在棧中依次新增三個元素a,b,c,將其儲存在m_queue1中(通過函式m_queue1.push())

3. 假設此時需要彈出元素,由棧的先進後出原則,我們可知此時只能彈出元素c。由於c在m_queue1中,並且m_queue1訪問元素的原則是先入先出,那麼必須將m_queue1中的元素a和b先轉移到m_queue2中以後才能將m_queue1中的元素c取出。於是先將m_queue1中的除最後乙個元素外的所有元素(即a,b),新增到m_queue2中,此時,m_queue1只有乙個元素c,通過m_queue1.pop(c)刪除。見以下**:

if (m_queue2.empty())

m_queue1.pop(); //刪除元素,此時m_queue1為空,但是m_queue2不一定為空

}

若此時需要繼續彈出元素,那麼將m_queue2中的第乙個元素(a)新增到m_queue1中,然後將m_queue2中的元素(b)刪除

4. 此時繼續新增元素,應該向不為空的佇列中新增

5. 在步驟3中,在彈出元素c以後,如果此時繼續新增元素d。那麼應該將元素d新增在什麼地方呢?此時m_queue1為空,該將d新增到佇列中m_queue1

總結:

以上的方法中,始終保證乙個隊列為空,另乙個佇列不為空;或者兩個佇列均為空

新增元素push:當m_queue1和m_queue2均為空時,那麼向m_queue1中新增新增元素(push);當m_queue1不為空時,向m_queue1中新增元素;當m_queue1為空,而m_queue2不為空時,向m_queue1中新增元素。即,始終向m_queue1中新增元素

彈出元素:

1. 若m_queue2為空,那麼將m_queue1中的所有元素(除最先新增的那個元素外)依次取出(top),然後push到m_queue2中,然後將這些元素從m_queue1中刪除(pop),然後將最後乙個元素也從m_queue1中刪除(pop)

2. 若m_queue1為空,那麼將m_queue2中的所有元素(除最先新增的那個元素外)依次取出(top),然後push到m_queue1中,然後將這些元素從m_queue2中刪除(pop),然後將最後乙個元素也從m_queue2中刪除(pop)

**如下:

template

class mystack

else

if (!m_queue1.empty())

//此時m_queue1為空,m_queue2不為空

else

if (!m_queue2.empty())

}void pop()//刪除元素

m_queue1.pop();

//刪除元素,此時m_queue1為空,但是m_queue2不一定為空

}

else

if (m_queue1.empty())

m_queue2.pop();

}

}

};

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

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