数据结构 —— 栈的顺序存储结构与链式存储结构 代码

最近复习数据结构,学到栈这里,说到栈是限定仅仅在表尾进行插入和删除操作的线性表,其实现同线性表一样具有顺序存储结构与链式存储结构两种实现方式,本人基于着两种方式对栈结构进行了实现,下面直接上代码:

	#pragma once
#include <memory>
namespace RL 
{
// 栈的链式存储结构代码
	template<typename SElemType>
	class StackNode
	{
	public:
		typedef std::shared_ptr<StackNode<SElemType>> StackNodePtr;
		SElemType data;
		StackNodePtr next;
	};


	template<typename SElemType>
	class LinkStack
	{
	public:
		typedef std::shared_ptr<StackNode<SElemType>> StackNodePtr;
		LinkStack()
		{
			top = nullptr;
			count = 0;
		}
		~LinkStack()
		{

		}

		int Push(const SElemType &e) 
		{
			StackNodePtr node = std::shared_ptr<StackNode<SElemType>>(new StackNode<SElemType>());
			node->data = e;
			node->next = top;
			top = node;
			count++;
			return 0;
		}

		int GetPop(SElemType &e)
		{
			if (top)
			{
				e = top->data;
			/*	top = top->next;
				count--;*/
				return 0;
			}
			return 1;
		}

		bool Clear()
		{
			while (count)
			{
				Pop();
			}
		}
		SElemType Pop()
		{
			SElemType e;
			if (top)
			{
				e = top->data;
				top = top->next;
				count--;
			}
			return e;
		}

		bool isEmpty() 
		{
			return count?false:true;
		}
		int Length()
		{
			return count;
		}

	private:
		StackNodePtr top;
		int count;
	};


// 栈的顺序存储结构代码
	template<typename SElemType>
	class SqStack
	{
	public:
		SqStack() 
			:m_capacity(10)
			, m_length(0)
		{
			m_data_array_ptr = new SElemType[m_capacity];
		}
		SqStack(int _capacity)
			:m_capacity(_capacity)
			, m_length(0)
		{
			m_data_array_ptr = new SElemType[m_capacity];
		}

		~SqStack() 
		{
			if (m_data_array_ptr)
			{
				delete[]m_data_array_ptr;
			}
		}
		void Push(const SElemType &e)
		{
			if (m_length >= m_capacity)
			{
				m_capacity *= 2;
				SElemType * _data_array_ptr = new SElemType[m_capacity];
				for (int i = 0; i < m_length; i++)
				{
					_data_array_ptr[i] = m_data_array_ptr[i];
				}
				delete[]m_data_array_ptr;
				m_data_array_ptr = _data_array_ptr;
			}
			m_data_array_ptr[m_length++] = e;
		}

		SElemType Pop() 
		{
			if (m_length)
			{
				return m_data_array_ptr[--m_length];
			}
			return SElemType();
		}

		int ReSetCapacity(int _capacity)
		{
			if (_capacity <= 0)
			{
				return 1;
			}
			if (m_data_array_ptr)
			{
				delete[]m_data_array_ptr;
			}
			m_capacity = _capacity;
			m_data_array_ptr = new SElemType[m_capacity];
			return 0;
		}

		bool isEmpty()
		{
			return m_length ? false : true;
		}
		int Length()
		{
			return m_length;
		}
		int Capacity() 
		{
			return m_capacity;
		}

		bool Clear()
		{
			m_length = 0;
		}
	private:
		int m_capacity;
		int m_length;
		SElemType * m_data_array_ptr;
	};
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值