MyTL我的模板库第一篇,Stack栈类双向链表实现

1 篇文章 0 订阅

一直很想造一个模板库,趁着放假有时间继续完成,部分类原型在在几个月就已经完成,经过不断迭代勉强能用,准备在未来完成的web后端服务器中尽可能的多使用MyTL。c++的内存管理异常的复杂,尽管使用了智能指针但还是在内存管理这块花了三分之二以上的时间。
MyTL的GitHub
Stack的GitHub

namespace 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可以直接zanllp@163.com给我,或者直接留言
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值