棧和佇列面試題(三) 用兩個佇列實現乙個棧

2021-07-30 14:52:45 字數 1268 閱讀 1790

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