MyTL我的模板库第一篇,Stack栈类双向链表实现
一直很想造一个模板库,趁着放假有时间继续完成,部分类原型在在几个月就已经完成,经过不断迭代勉强能用,准备在未来完成的web后端服务器中尽可能的多使用MyTL。c++的内存管理异常的复杂,尽管使用了智能指针但还是在内存管理这块花了三分之二以上的时间。
MyTL的GitHub
Stack的GitHub
amespace MyTL
{
//保存数据的节点 双向链表
template<typename T>
struct Node
{
template <typename T> friend class Iter;
template <typename T> friend class Stack;
public:
using Node_sptr = shared_ptr<Node<T>>;
Node() = default;
Node(T _DATA,Node_sptr _LAST);
T data;//数据
T GetData();
bool is_empty = false;//表示这个结点不包含数据,只有链接
private:
Node_sptr next;//下个节点位置
Node_sptr last;//上个节点位置
};
template<typename T>
class Iter
{
public:
using Node_sptr = shared_ptr<Node<T>>;
Node_sptr node_now;
Iter(Node_sptr node) noexcept;
Iter();
//给范围for用的
bool operator!=(Iter<T> diff) noexcept;
//解除引用
T operator *() ;
//左自加
Iter<T> operator++() ;
//右自加
Iter<T> operator++(int) noexcept;
//左自减
Iter<T> operator--();自减
Iter<T> operator--(int) noexcept;
~Iter();
};
template<typename T>
class Stack//管理双向链表各个节点的类
{
using Node_sptr = shared_ptr<Node<T>>;
public:
Stack() noexcept;
~Stack();
//拷贝构造
Stack(const Stack<T> &src) noexcept;
//压入栈
void Push(T _data) noexcept;
//弹出最后一个节点
void Pop() noexcept ;
//返回尾索引
Iter<T> end() noexcept;
//返回头迭代器
Iter<T> begin() noexcept;
//清空栈
void clear();
//是否为空
bool is_empty() noexcept;
//根据索引返回迭代器
Iter<T> Index(int index);
//下标索引
Iter<T> operator[](int index);
//s插入到哪里,0头部1第二个位置,-1在尾部插入
void Insert(int pos, Iter<T>& iter) ;
//节点 data 插入的数据,pos插入的位置
void Insert(T data, int pos);
//节点数量
int GetLength() noexcept ;
//复制构造
Stack<T>& operator=(const Stack<T> &src) noexcept ;
int len;//链表长度
Node_sptr down;//栈底
Node_sptr top;//栈顶
};
若发现bug可以直接[email protected]给我,或者直接留言