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;
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值