使用两个栈实现一个队列
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() << ' ';
}
思路:先把数据存到一个栈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() << ' ';
}
相关文章推荐
- Cannot find `include file "timescale.v" in directories
- ---Jsp(四)page指令
- hdu 5700 区间交 (线段树+枚举)
- 41.Oracle深度学习笔记——shared_pool底层知识大集合
- 初始JSP表达式语言-EL
- 05_更新数据
- Handler的postDelayed方法
- Android的消息机制
- 当errno = ENITR
- SQLSERVER触发器内INSERT,UPDATE,DELETE三种状态
- Android 中 Canvas 绘图之 PorterDuffXfermode 使用及工作原理详解
- java学习笔记之 static
- 校外实习-第三周总结
- mac更换ssd 硬盘分区 移动硬盘WTG安装win10
- Linux - ncat ssl backdoor
- warning C4305:“初始化”:从“double”到“float”截断
- pyqt5和qt-designer结合
- Memory Card、逻辑加密卡、CPU卡
- C#将wps表格读到datatable中并显示在页面
- shell 脚本 批量创建用户密码随机