佇列是先進先出容器,而棧是先進後出容器。
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...