一:queue是一種」先進先出」的資料結構,他在對尾插入元素,在隊頭刪除元素,他既可以取到自己的隊頭元素,也可以取到自己的隊尾元素;
stack是一種」先進後出」的資料結構,他對元素的插入和刪除都是在棧頂完成的;他不可以取自己棧底的元素;只能去取自己棧頂的元素;
所以用兩個佇列實現乙個棧,就是用佇列」先進先出「的原則實現棧「先進後出」特點:
所以只要實現棧的插入,刪除,和返回棧頂元素三個方法即可;
(1)插入:每次找不為空的佇列進行插入,這樣就不存在確定的輔助佇列和主佇列之說,兩個佇列交替儲存資料;這樣效率更高;
(2)刪除;每次先找到不為空的佇列,然後將這個佇列當做主佇列,將另乙個輔助佇列,將主佇列的資料依次取隊頭元素插入輔助佇列,直到主佇列剩下乙個元素;然後利用棧的頭刪功能將次元素刪除;
(3)返回棧頂元素:那個佇列不為空,就取那個佇列的隊尾返回;這就是棧的棧頂元素;
二:圖說
三:**實現:
#include
using
namespace
std;
#include
template
class stack
else
if(!_q1.empty())//q1不為空,q2為空
else
//q1為空,q2不為空
}void pop()//刪除
/*else*/
if (!_q1.empty())//_q1不為空,_q2為空
_q1.pop();//_q1中留下乙個刪除
}else
//_q2不為空,_q1為空
_q2.pop();//_q2中留下乙個刪除}}
t& top()//取棧頂元素
else
//如果_q1為空,_q2不為空
return _q2.back();
}private:
//兩個佇列成員
queue
_q1;
queue
_q2;
};
測試用例:
void test()
int main()
四、執行結果
面試題 4 用兩個棧實現佇列 用兩個佇列實現棧
首先,我們知道 棧 是先進後出的,佇列 是先進先出的。我們先在 stack1 中插入 a b c d 四個字母。此時,我們如果要做出隊操作的話,a 應該首先被 pop 出來,那麼我們想到,把 stack1 中的所有數 先 pop 出來,那麼 a 就可以出隊了。這時,我們可以利用 stack2 我們將...
面試題7 用兩個棧實現佇列和用兩個佇列實現乙個棧
template class cqueue 解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。例項 include include includeusing namespace std template cl...
面試題7 用兩個棧實現佇列和用兩個佇列實現乙個棧
template class cqueue 解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。例項 view code include include include using namespace std ...