stack & queue
- [1、学习stack & queue](#1、学习stack & queue)
- [2、模拟实现stack & queue](#2、模拟实现stack & queue)
1、学习stack & queue
stack遵循的规则:LIFO(后进先出)。
stack的常用接口非常简单,我们早在"数据结构"专栏中就已经见过了类似的接口。

stack是不支持迭代器的,否则就无法保证严格的后进先出。
queue遵循的规则:FIFO(先进先出)。

queue同样不支持迭代器。
2、模拟实现stack & queue
2.1、模拟实现stack
我们之前在数据结构的学习中,模拟实现stack使用的是数组,那么我们这里模拟实现stack,是否可以对vector进行封装呢?
确实是可以的。但是有更好的方法:适配器。

我们的手机,通过电源适配器,可以连接充电宝、车载电源、家用电源进行充电。
那么stack,也可以通过适配器(vector、list等数据结构),以实现各种方法。
cpp
// stack.h
#include<iostream>
#include<vector>
#include<list>
#include<deque>
using namespace std;
namespace yzc
{
template<class T, class Container = deque<T>>
class stack
{
public:
void push(const T& val) { _con.push_back(val); }
void pop() { _con.pop_back(); }
T& top() { return _con.back(); }
size_t size() const { return _con.size(); }
bool empty() { return size() == 0; }
private:
Container _con;
};
}
vector作底层:

list做底层:

2.2、模拟实现queue
queue也可以使用适配器实现:
cpp
// queue.h
#include<iostream>
#include<vector>
#include<list>
#include<deque>
using namespace std;
namespace yzc
{
template<class T, class Container = deque<T>>
class queue
{
public:
void push(const T& val) { _con.push_back(val); }
void pop() { _con.pop_front(); }
T& front() { return _con.front(); }
T& back() { return _con.back(); }
size_t size() const { return _con.size(); }
bool empty() { return size() == 0; }
private:
Container _con;
};
}
deque作底层:

list作底层:

但是vector作底层就不行:

因为vector并没有实现头删方法:

也就意味着,queue对于适配器的选择,是有要求的。