一: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;
}
四、运行结果
☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺