目录
一Stack
1介绍
先来看看库中对栈的介绍:
2接口
3模拟实现
#include<vector>
namespace bite
{
template<class T>
class stack
{
public:
stack() {}
void push(const T& x) { _c.push_back(x); }
void pop() { _c.pop_back(); }
T& top() { return _c.back(); }
const T& top()const { return _c.back(); }
size_t size()const { return _c.size(); }
bool empty()const { return _c.empty(); }
private:
std::vector<T> _c;
}
}
4栈的oj题
二Queue
1介绍
1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素:元素从队尾入队列,从队头出队列
3. 标准容器类deque和list满足了这些要求。默认情况下,如果没有为queue实例化指定容器类,则使用标准容器deque。
2接口
3模拟实现
因为queue的接口中存在头删和尾插,因此使用vector来封装效率太低,故可以借助list来模拟实现
#include <list>
namespace bite
{
template<class T>
class queue
{
public:
queue() {}
void push(const T& x) { _c.push_back(x); }
void pop() { _c.pop_front(); }
T& back() { return _c.back(); }
const T& back()const { return _c.back(); }
T& front() { return _c.front(); }
const T& front()const { return _c.front(); }
size_t size()const { return _c.size(); }
bool empty()const { return _c.empty(); }
private:
std::list<T> _c;
}
}
三容器适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
1再谈栈和队列
template<class T,class Container = deque<T>>//库中给出的缺省值是deque<T>
class Stack
{
public:
bool empty()
{
return _v.empty();
}
size_t size()
{
return _v.size();
}
const T& top()
{
return _v.back();
}
void push(const T& x)
{
_v.push_back(x);
}
void pop()
{
_v.pop_back();
}
private:
Container _v;
};
四优先级队列
1接口
如果我们想让它打印出来是升序呢?
在模板中传类型:
2仿函数
3模拟实现
//适配器进行容器调用
namespace bit
{
template<class T,class Container = deque<T>>
class Stack
{
public:
bool empty()
{
return _v.empty();
}
size_t size()
{
return _v.size();
}
const T& top()
{
return _v.back();
}
void push(const T& x)
{
_v.push_back(x);
}
void pop()
{
_v.pop_back();
}
private:
Container _v;
};
template<class T, class Container = deque<T>>
class Queue
{
public:
bool empty()
{
return _l.empty();
}
size_t size()
{
return _l.size();
}
const T& front()
{
return _l.front();
}
const T& back()
{
return _l.back();
}
void push(const T& x)
{
_l.push_back(x);
}
void pop()
{
_l.pop_front();
}
private:
Container _l;
};
template<class T>
class greater
{
public:
bool operator()(const T& x,const T& y)
{
return x > y;
}
};
template<class T>
class less
{
public:
bool operator()(const T& x, const T& y)
{
return x < y;
}
};
template<class T,class Container=vector<T>,class Compare = less<T>>
class priority_queue
{
public:
bool empty() const
{
return _pro.empty();
}
size_t size() const
{
return _pro.size();
}
const T& top() const
{
return _pro[0];
}
//less -> 降序 -> 建大堆(与HeapSort的逻辑不同)
void AjustUp(size_t child)
{
Compare com;
size_t parent = (child - 1) / 2;
while (child >0)
{
//_pro[parent] < _pro[child]
if (com(_pro[parent] , _pro[child]))
{
swap(_pro[child], _pro[parent]);
child = parent;
parent = (child - 1) / 2;
}
else
{
break;
}
}
}
void push(const T& val)
{
_pro.push_back(val);
AjustUp(_pro.size()-1);
}
void AjustDown(size_t parent)
{
Compare com;
size_t child = parent * 2 + 1;
while (child < _pro.size())
{
//选最大(降序)的child与parent交换 _pro[child] < _pro[child + 1]
if (child + 1<_pro.size() && com(_pro[child] , _pro[child+1]))
{
child++;
}
// _pro[parent] < _pro[child]
if (com(_pro[parent] , _pro[child]))
{
swap(_pro[child], _pro[parent]);
parent = child;
child = parent * 2 + 1;
}
else
{
break;
}
}
}
void pop()
{
swap(_pro[0], _pro[_pro.size() - 1]);
_pro.pop_back();
AjustDown(0);
}
private:
Container _pro;
};
五dequeue的简单介绍
但deque并不是真正连续的空间,而是由一段段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组:
以上便是我的学习整理,有错误欢迎在评论区里指出,感谢您的观看!!