Stack、StaticStack、LinkStack

栈的知识点

  栈的特点:
    栈只能操作栈顶,除栈顶外的元素都不可以操纵
    数据后进先出,数据始终插入在栈顶,移除也只能先移除栈顶

栈的后进先出
栈的继承结构

Stack

Stack.h

#ifndef __Stack_H_
#define __Stack_H_
#include "Object.h"

namespace JYlib
{

/*
抽象父类 栈(后进后出)
*/
template < typename T >
class Stack : public Object
{
public:
	virtual void push(const T& e)=0;

	virtual void pop()=0;

	virtual T top()const=0;

	virtual void clear()=0;

	virtual int size()=0;

};


}
#endif

StaticStack

  静态栈的特点:
    栈容量大小固定(通过模板参数确定)
    栈内的数据是拷贝过来的,与原对象无关
    静态栈初始化时,(原生数组)会进行无参构造,数据加入时发生拷贝构造效率低下

StaticStack.h

#ifndef __StaticStack_H_
#define __StaticStack_H_
#include "Stack.h"
#include "Exception.h"


namespace JYlib
{

/*
顺序栈
*/
template < typename T,int N >
class StaticStack : public Stack<T>
{
protected:
	T m_space[N];//栈空间大小
	int m_size;//栈当前使用大小
	int m_top;//栈顶
public:
	StaticStack()
	{
		m_top = -1;
		m_size = 0;
	}

	int capacity()
	{
		return N;
	}
	
	void push(const T& e)
	{
		if(m_size < N)
		{
			m_space[m_top + 1] = e;
			m_top++;
			m_size++;
		}
		else
		{
			THROW_EXCEPTION(Invalid0ParameterException,"No space in current stack ...");
		}
	}

	void pop()
	{
		if(m_size > 0)
		{
			m_top--;
			m_size--;
		}
		else
		{
			THROW_EXCEPTION(Invalid0ParameterException,"No element in current stack ...");
		}
	}

	T top()const
	{
		if(m_size > 0)
		{
			return m_space[m_top];
		}
		else
		{
			THROW_EXCEPTION(Invalid0ParameterException,"No element in current stack ...");
		}
	}

	void clear()
	{
		m_top = -1;
		m_size = 0;
	}

	int size()
	{
		return m_size;
	}

	~StaticStack()
	{

	}
};



}



#endif

LinkStack

  链式栈的特点:
    组合使用LinkList,使得栈容量大小可以一直拓展
    栈内的数据是通过链表指针指向的,与原对象有关
    链式栈初始化时,仅仅是初始化链表,与指针指向数据,避免了无参构造以及拷贝构造,效率高

LinkStack.h

#ifndef __LinkStack_H_
#define __LinkStack_H_
#include "Stack.h"
#include "LinkList.h"
#include "Exception.h"

namespace JYlib
{

/*
链式栈
组合使用链表,类对象时效率高,避免创建时的构造与析构
*/
template < typename T >
class LinkStack : public Stack<T>
{
protected:
	LinkList<T> m_list;
public:
	LinkStack()
	{

	}
	
	void push(const T& e)
	{
		m_list.insert(0,e);
	}

	void pop()
	{
		if(m_list.length() > 0)
		{
			m_list.remove(0);
		}
		else
		{
			THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
		}
	}

	T top()const
	{
		if(m_list.length() > 0)
		{
			return m_list.get(0);
		}
		else
		{
			THROW_EXCEPTION(InvalidParameterException,"No element in current stack ...");
		}
	}

	void clear()
	{
		m_list.clear();
	}

	int size()
	{
		return m_list.length();
	}

	~LinkStack()
	{

	}
};



}



#endif

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值