数据结构之特殊的线性表(环形队列的代码实现)

讲在前面:
在实现该队列的代码是遇到两个问题
1.在声明重载Customer的构造函数时,要对构造函数中的参数初始化,不然会报没有合适的默认构造函数可用
2.在实现模板函数时,模板函数的声明和定义需放在同一个文件中,如下:MyQueue.h

/**************************
******Customer.h***********
***************************/
#pragma once
#include<string>
#include<iostream>
using namespace std;

class Customer 
{
public:
	Customer(string Name="Tom", int Age=1);//重载构造函数要对形参进行初始化,不然在对Customer进行实例化时会报错:不存在默认构造函数
	friend ostream & operator<<(ostream &os, const Customer &customer);//重载输出符使得可以打印Customer的信息
    //void printInfo()const;

private:
	string m_sName;
	int m_iAge;

};
/**************************
******Customer.cpp***********
***************************/
#include "Customer.h"

Customer::Customer(string Name, int Age)
{
	m_sName = Name;
	m_iAge = Age;
}

//void Customer::printInfo() const
//{
//	cout<<"姓名:"<<m_sName<<endl;
//	cout<<"年龄:" << m_iAge << endl;
//	cout << endl;
//}

ostream & operator <<(ostream &os, const Customer &customer)
{
	os << "name:" << customer.m_sName << endl;
	os << "age:" << customer.m_iAge << endl;
	return os;
}
/**************************
******MyQueue.h***********
***************************/
#pragma once
/*环形队列C++的实现*/

#include"stdio.h"
#include"Customer.h"
template<typename T>
class MyQueue
{
public:
	MyQueue(int queueCapacity);        //InitQueue(&Q)创建队列
	virtual~MyQueue();                 //DestoryQueue(&Q)销毁队列
	void ClearQueue();                 //ClearQueue(&Q) 清空队列
	bool QueueEmpty() const;           //QueueEmpty(Q)判空队列
	bool QueueFull() const;            //QueueFull(Q)判满队列
	int QueueLength()const;            //QueueLength(Q)队列长度
	//bool EnQueue(int element);         //EnQueue(&Q element)新元素入队
	bool EnQueue(T element);

	//bool DeQueue(int &element);        //DeQueue(&Q &element)新元素出队
	bool DeQueue(T &element);

	void QueueTraverse();              //QueueTraverse(Q,visit())遍历队列
private:
	//int *m_pQueue;              //队列数组指针
	
	T *m_pQueue;
	int m_iQueueLen;            //队列元素个数
	int m_iQueueCapacity;        //队列数组容量
	int m_iHead;                   
	int m_iTail;
};

template<typename T>
MyQueue<T>::MyQueue(int queueCapacity)       //InitQueue(&Q)创建队列
{

	m_iQueueCapacity = queueCapacity;
	m_pQueue = new T[m_iQueueCapacity];
	ClearQueue();
}

template<typename T>
MyQueue<T>::~MyQueue()                 //DestoryQueue(&Q)销毁队列
{
	delete[]m_pQueue;
	m_pQueue = NULL;
}

template<typename T>
void MyQueue<T>::ClearQueue()                 //ClearQueue(&Q) 清空队列
{
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLen = 0;
}

template<typename T>
bool MyQueue<T>::QueueEmpty()const          //QueueEmpty(Q)判空队列
{
	if (m_iQueueLen == 0)
	{
		return true;
	}
	else
		return false;
	//return m_iQueueLen==0?true:false;

}

template<typename T>
int MyQueue<T>::QueueLength()const            //QueueLength(Q)队列长度
{
	return m_iQueueLen;
}

template<typename T>
bool MyQueue<T>::QueueFull() const
{
	if (m_iQueueLen == m_iQueueCapacity)
	{
		return true;
	}
	else
		return false;
}

template<typename T>
bool MyQueue<T>::EnQueue(T element)         //EnQueue(&Q element)新元素入队
{
	if (QueueFull())
	{
		return false;
	}
	else
	{
		m_pQueue[m_iTail] = element;
		m_iTail++;
		m_iTail = m_iTail % m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}

}

template<typename T>
bool MyQueue<T>::DeQueue(T&element)        //DeQueue(&Q &element)新元素出队
{
	if (QueueEmpty())
	{
		return false;
	}
	element = m_pQueue[m_iHead];
	m_iHead++;
	m_iHead = m_iHead % m_iQueueCapacity;
	m_iQueueLen--;
	return true;
}

template<typename T>
void MyQueue<T>::QueueTraverse()              //QueueTraverse(Q,visit())遍历队列
{
	for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++)
	{
		cout << m_pQueue[i%m_iQueueCapacity] << endl;
	}
	cout << endl;
}

/**************************
******demo.cpp***********
***************************/
#include <iostream>
#include<stdlib.h>
#include"MyQuence.h"
#include"Customer.h"
using namespace std;
/***********************
********实现环形*******
***********************/

int main(void)
{

	MyQueue<Customer> *p = new MyQueue<Customer>(4);
	Customer c1("zhangsan",20);
	Customer c2("lisi", 16);
	Customer c3("wangwu", 21);
	Customer c4("zhaoqian", 22);

	p->EnQueue(c1);
	p->EnQueue(c2);
	p->EnQueue(c3);
	p->EnQueue(c4);
	p->QueueTraverse();
	cout << "删除" << endl;
	Customer e;
	p->DeQueue(e);
	cout<<"遍历"<<endl;
	p->QueueTraverse();

	/*MyQueue<char> *p = new MyQueue<char>(4);
	p->EnQueue('a');
	p->EnQueue('b');
	p->EnQueue('c');
	p->EnQueue('d');
    
	p->QueueTraverse();

	char e;
	p->DeQueue(e);

	cout<<"删除后的遍历"<<endl;

	p->QueueTraverse();
*/

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值