棧和佇列面試題(三)---用兩個佇列實現一個棧
阿新 • • 發佈:2019-01-07
一:queue是一種”先進先出”的資料結構,他在對尾插入元素,在隊頭刪除元素,他既可以取到自己的隊頭元素,也可以取到自己的隊尾元素;
stack是一種”先進後出”的資料結構,他對元素的插入和刪除都是在棧頂完成的;他不可以取自己棧底的元素;只能去取自己棧頂的元素;
所以用兩個佇列實現一個棧,就是用佇列”先進先出“的原則實現棧“先進後出”特點:
所以只要實現棧的插入,刪除,和返回棧頂元素三個方法即可;
(1)插入:每次找不為空的佇列進行插入,這樣就不存在確定的輔助佇列和主佇列之說,兩個佇列交替儲存資料;這樣效率更高;
(2)刪除;每次先找到不為空的佇列,然後將這個隊列當做主佇列,將另一個輔助佇列,將主佇列的資料依次取隊頭元素插入輔助佇列,直到主佇列剩下一個元素;然後利用棧的頭刪功能將次元素刪除;
(3)返回棧頂元素:那個佇列不為空,就取那個佇列的隊尾返回;這就是棧的棧頂元素;
二:圖說
三:程式碼實現:
#include <iostream>
using namespace std;
#include <queue>
template<class T>
class Stack
{
public:
void Push(const T& data)//插入
{
if (_q1.empty()&&_q2.empty())//兩個佇列都為空
{
_q1.push(data);//向_q1種插入元素
}
else if(!_q1.empty())//q1不為空,q2為空
{
_q1.push(data);//向_q1種插入元素
}
else//q1為空,q2不為空
{
_q2.push(data);//向_q2種插入元素
}
}
void Pop()//刪除
{
//if (_q1.empty()&&_q2.empty())//_q1,_q2為空
//{
// cout<<"無元素"<<endl;
//}
/*else*/
if (!_q1.empty())//_q1不為空,_q2為空
{
while (_q1.size()>1)//轉移元素到_q2,_q1中留下一個刪除
{
_q2.push(_q1.front());
_q1.pop();
}
_q1.pop();//_q1中留下一個刪除
}
else
//_q2不為空,_q1為空
{
while (_q2.size()>1)//轉移元素到_q1,_q2中留下一個刪除
{
_q1.push(_q2.front());
_q2.pop();
}
_q2.pop();//_q2中留下一個刪除
}
}
T& Top()//取棧頂元素
{
if (!_q1.empty())//如果_q1不為空,_q2為空
{
return _q1.back();//返回_q1隊尾元素
}
else//如果_q1為空,_q2不為空
return _q2.back();
}
private:
//兩個佇列成員
queue<T> _q1;
queue<T> _q2;
};
測試用例:
void test()
{
Stack<int> s;
s.Push(1);
s.Push(2);
s.Push(3);
s.Push(4);
cout<<s.Top()<<endl;
s.Pop();
s.Pop();
cout<<s.Top()<<endl;
}
int main()
{
test();
system("pause");
return 0;
}
四、執行結果
☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺