您的位置:首页 > 其它

使用两个栈实现一个队列

2016-07-23 23:03 260 查看
首先得了解到,栈和队列最大的不同就在于  栈是先进后出 ,队列是 先进先出

思路:先把数据存到一个栈s1 , 再从栈s1 出到s2中,返回s2 就实现了

解析:其实就像之前我写的一个 博客里面提到的一个方法叫 “三步翻转法”, 这里就是使用了 栈和队列的特性相反,从而实现了   两次逆序==>顺序 的过程。

实现如下:

template<class T>
class Queue_By_2Stack
{
public:
void push(const T& data)//尾插
{
_s1.push(data);
}
void Pop()//头删
{
assert(!_s1.empty() || !_s2.empty());
if (_s2.empty())//s2为空
{
while (_s1.size() > 0)
{
_s2.push(_s1.top());
_s1.pop();
}
}
_s2.pop();
}
T& Back()
{
assert(!_s1.empty() || !_s2.empty());
if (_s1.empty())//s1为空
{
while (_s2.size() > 0)
{
_s1.push(_s1.top());
_s2.pop();
}
}
return _s1.top();
}
T& Front()
{
assert(!_s1.empty() || !_s2.empty());
if (_s2.empty())//s2为空
{
while (_s1.size() > 0)
{
_s2.push(_s1.top());
_s1.pop();
}
}
return _s2.top();
}
bool Empty()
{
return _s2.empty() && _s1.empty();/////都为空才 是空
}

private:
stack<T> _s1;
stack<T> _s2;
};

其实有时候身边就有那种 把东西写出来  却不知道怎么测的小盆友, 所以还是给出 测试的函数

测试:

void Funtest4()
{
Queue_By_2Stack<int> Qb;
Qb.push(1);
Qb.push(2);
cout << Qb.Back() << ' ';
cout << Qb.Front() << endl;

Qb.Pop();
Qb.Pop();
Qb.push(3);
Qb.push(4);
cout<<Qb.Back() << ' ';
cout << Qb.Front() << endl;

cout << Qb.Empty() << ' ';

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: