前言
目录
预备知识:
- 容器
容器(container)用于存放数据的类模板。可变长数组、链表、平衡二叉树等数据结构在 STL 中都被实现为容器
- 容器适配器
适配器是一种将一个类的接口转换成客户希望的另外一个接口的设计模式
- vector
vector是一个大小可变的序列是容器
我们的stack和queue,底层实现便是将vector的接口进行了封装,对外展现出了一些符合stack和queue特性的新接口,这是一种复用的行为
1.stack的接口及模拟实现
stack是栈,符合LIFO(后进先出)的特点
接口 | 功能 |
---|---|
empty() | 判空 |
size() | 返回元素个数 |
top() | 返回栈顶元素 |
push() | 压栈 |
pop() | 弹出栈顶元素 |
swap() | 交换 |
模拟实现
namespace imdanteking
{
template<class T>
class stack {
public:
stack()
{}
~stack()
{}
stack(const stack& st) {
_v(st._v);
}
void push(T data) {
_v.push_back(data);
}
void pop() {
assert(!empty());
_v.pop_back();
}
const T& top() {
assert(!empty());
return _v.back();
}
bool empty() {
return _v.empty();
}
void swap(stack st) {
st._v.swap(_v);
}
size_t size()const {
return _v.size();
}
private:
vector<T> _v;
};
void Test1() {
stack<int> st1;
cout << st1.empty() << endl;
st1.push(1);
cout << "size: " << st1.size() << endl;
st1.push(2);
st1.push(3);
st1.push(4);
st1.push(5);
st1.push(6);
cout <<"size: " << st1.size() << endl;
while (!st1.empty()) {
cout << st1.top() << endl;
st1.pop();
}
cout << st1.empty() << endl;
cout << "size: " << st1.size() << endl;
}
}
2.queue的接口及模拟实现
queue是队列,符合FIFO(先进先出)的特点
接口 | 功能 |
---|---|
empty() | 判空 |
size() | 返回元素个数 |
front() | 返回队列第一个元素 |
back() | 返回队列最后一个元素 |
push() | 队尾插入元素 |
pop() | 队头删除元素 |
swap() | 交换 |
模拟实现
namespace imdanteking
{
template <class T>
class queue {
public:
queue() {}
~queue() {}
void push(const T& val) {
_v.push_back(val);
}
void pop() {
assert(!_v.empty());
_v.erase(_v.begin());
}
const T& front() const {
assert(!_v.empty());
return _v.front();
}
const T& back() const {
assert(!_v.empty());
return _v.back();
}
bool empty() {
return _v.size() == 0;
}
size_t size() {
return _v.size();
}
void swap(queue q) {
_v.swap(q._v);
}
private:
vector<T> _v;
};
void Test1() {
queue<int> q;
q.push(1);
q.push(2);
cout << q.back() << endl;
q.push(3);
cout << q.back() << endl;
q.push(4);
q.push(5);
cout << "size: " << q.size() << endl;
cout << q.front() << endl;
while (!q.empty()) {
cout << "front: " << q.front() << endl;
cout << "back: " << q.back() << endl;
q.pop();
}
cout << "size: " << q.size() << endl;
}
}