数据结构 之 循环队列

来源:互联网 发布:MySQL 转为percona 编辑:程序博客网 时间:2024/05/16 02:31

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

以下为例。

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;}


运行结果:




原创粉丝点击