数据结构 之 循环队列

队列符合先进先出的原则,循环队列可以持续地往队列里增加元素、减少元素。

以下为例。

MyQueue.h

#ifndef MYQUEUE_H
#define MYQUEUE_H

#include"Customer.h"
#include"MyQueue.h"
#include<iostream>
using namespace std;

template <typename T>//用类模板

class MyQueue
{
public:
	MyQueue(int QueueCapacity);
	virtual ~MyQueue();
	void ClearQueue();
	bool QueueEmpty()const;
	bool QueueFull()const;
	int QueueLength()const;
	bool EnQueue(T element);
	bool DeQueue(T &element);
	void QueueTraverse();
private:
	T * m_pQueue;//队列里的每个元素都是一个类的对象
	int m_iQueueLen;
	int m_iQueueCapacity;
	int m_iHead,m_iTail;//队头队尾的脚标
};


template <typename T>    
MyQueue<T>::MyQueue(int QueueCapacity)
{
	m_iQueueCapacity = QueueCapacity;
	m_pQueue = new T[m_iQueueCapacity];
	ClearQueue();//直接调用
	cout << "MyQueue(int QueueCapacity)" << endl;
}

template <typename T>
MyQueue<T>::~MyQueue()
{
	delete []m_pQueue;
	m_pQueue = NULL;
	cout << "~MyQueue()" << endl;
}

template <typename T>
void MyQueue<T>::ClearQueue()
{
	m_iQueueLen = 0;
	m_iHead = m_iTail = 0;
}

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

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

template <typename T>
int MyQueue<T>::QueueLength()const
{
	return m_iQueueLen;
}

template <typename T>
bool MyQueue<T>::EnQueue(T element)
{
	if(QueueFull()){
		return false;
	}else{
		m_pQueue[m_iTail] = element;
		m_iTail = (m_iTail + 1)%m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}
}

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


template <typename T>
void MyQueue<T>::QueueTraverse()
{//类模板不允许对不同T的不同操作,所以如果要对int类型也实现.printInfo是没有办法的,因为int没有该成员函数,能做的就是自己定义一个自己的int类myInt,然后定义成员函数printInfo,这样就能和customer统一代码了
	//cout << endl;
	//if(typeid(T) == typeid(Customer)){
	//	for(int i = 0;i < m_iQueueLen;i++){
	//		//cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << ",";
	//		m_pQueue[(i+m_iHead)%m_iQueueCapacity].printInfo();
	//		cout << "前面还有"  << i << "个元素" << endl;
	//	}
	//	cout << endl;
	//}
	//if(typeid(T)== typeid(int)){
	//	for(int i = 0;i < m_iQueueLen;i++){
	//		cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << ",";
	//		cout << "前面还有"  << i << "个元素" << endl;
	//	}
	//	cout << endl;
	//}
//可以改用运算符重载
	for(int i = 0;i < m_iQueueLen;i++){
		cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << endl;
		cout << "前面还有"  << i << "个元素" << endl;
	}
	cout << endl;
}
#endif


//没有MyQueue.cpp,在vs2012版本中,模板类的声明和定义必须都放在.h里面才能编译成功。


Customer.h

#ifndef  CUSTOMER_H
#define  CUSTOMER_H
#include<string>
using namespace std;
class Customer
{
	friend ostream& operator <<(ostream&,Customer&);
public:
	Customer(string name = "",int age = 0);
	void printInfo()const;
private:
	string m_strName;
	int m_iAge;
};













#endif



Customer.cpp

#include"Customer.h"
#include<iostream>
using namespace std;


Customer::Customer(string name,int age):m_strName(name),m_iAge(age)
{
	cout << "Customer(string name,int age)" << endl;
}

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

demo.cpp

#include"MyQueue.h"
#include<iostream>
#include<stdlib.h>
using namespace std;

ostream& operator <<(ostream&,Customer&);//友元全局函数

//环形队列

int main()
{
	MyQueue<Customer> *p = new MyQueue<Customer>(4);//初值赋4,表示4个元素。
	Customer c1("zxb",21),c2("zxz",21),c3("zxv",21),c4("zxj",21),c5("zx",21);
	p->EnQueue(c1);
	p->EnQueue(c2);
	p->EnQueue(c3);
	p->EnQueue(c4);
	p->EnQueue(c5);//已满,c5进不去
	p->QueueTraverse();
	cout << p->QueueEmpty() << p->QueueFull() << p->QueueLength() << endl;

	Customer test;
	p->DeQueue(test);
	test.printInfo();
	p->QueueTraverse();
	p->ClearQueue();
	cout << p->QueueLength() << endl;

	MyQueue<int> *p1 = new MyQueue<int>(4);
	p1->EnQueue(10);
	p1->EnQueue(7);
	p1->EnQueue(3);
	p1->EnQueue(1);
	p1->EnQueue(2);//队列已满,这个2无法成功添加
	p1->QueueTraverse();
	cout << p1->QueueEmpty() << p1->QueueFull() << p1->QueueLength() << endl;
	
	int test1;
	p1->DeQueue(test1);
	cout << test1 << endl << p1->QueueLength() << endl;
	p1->QueueTraverse();

	p1->DeQueue(test1);
	cout << test1 << endl << p1->QueueLength() << endl;
	p1->QueueTraverse();
	p1->ClearQueue();
	cout << p1->QueueEmpty() << endl;

	delete p;
	delete p1;
	system("pause");
	return 0;
}

ostream& operator <<(ostream& out,Customer& cos)
{
	out << "姓名:" << cos.m_strName << endl;
	out << "年龄:" << cos.m_iAge;
	return out;
}


运行结果:




猜你喜欢

转载自blog.csdn.net/zealice/article/details/77986324