C++使用模板实现栈(Stack)和队列(Queue)的数据结构算法

一、 模板介绍

1.函数模板的原理

(a )每一次使用一个新类型去调用模板,编译器内部都按照该类型生成新类型的函数
(b )这个生成新的具体类型函数的过程叫做模板的实例化
(c )每有一个新的模板实例化,d等于内部新增加了一个函数,编译尺寸会变大

2.类模板

(a )类模板的实例化过程和函数模板一样,也是根据调用类型实例化生成新的一个类
(b )类成员函数外编写需要重新指定:template <class T .>同时定义域前类名后带< T .>
(c )类模板如果是在同文件中声明,函数体也必须在头文件中编写
(d )可以使用关键字typename代替class

二、栈和队列模板化实现

1.栈

//Stack.h
#pragma once
template <typename DATA>
class Stack
{
	DATA *m_pData;
	int m_nTop;
	int m_nCount;
public:
	Stack(int nCount=10):m_nTop(-1)
	{
		m_pData = new DATA[nCount];
		m_nCount = nCount;
	}
	~Stack()
	{
		delete[]m_pData;
	}
	void push(const DATA& data)
	{
		if(!isFull())
			m_pData[++m_nTop] = data;
	}
	bool isFull()
	{
		return m_nTop + 1 >= m_nCount;
	}
	bool IsEmpty()
	{
		return m_nTop == -1;
	}
	bool pop(DATA &data)
	{
		if (IsEmpty())
			return false;
		data = m_pData[m_nTop--];
		return true;
	}
};

2.队列

//Queue.h
#pragma once
template<typename DATA>
class CQueue
{
	DATA *m_pData;
	int m_nCount;
	int m_nHead, m_nTail;
public:
	CQueue(int nCount = 5);
	~CQueue()
	{
		delete[]m_pData;
	}
	bool isFull()
	{
		return (m_nTail + 1)%m_nCount == m_nHead;
	}
	void push(const DATA& data);
	bool IsEmpty()
	{
		return m_nHead == m_nTail;
	}
	bool pop(DATA& data);
};

template<typename DATA>
CQueue<DATA>::CQueue(int nCount)
{
	m_nHead = m_nTail = 0;
	m_nCount = nCount + 1;
	m_pData = new DATA[m_nCount];
}

template<typename DATA>
void CQueue<DATA>::push(const DATA& data)
{
	if (isFull())
		return;
	m_pData[m_nTail] = data;
	m_nTail = (m_nTail + 1) % m_nCount;
}

template<typename DATA>
bool CQueue<DATA>::pop(DATA& data)
{
	if (IsEmpty())
		return false;
	data = m_pData[m_nHead];
	m_nHead = (m_nHead + 1) % m_nCount;
	return true;
}
发布了21 篇原创文章 · 获赞 20 · 访问量 2974

猜你喜欢

转载自blog.csdn.net/weixin_42844163/article/details/104143346