数据结构基础——循环队列的C++实现

来源:互联网 发布:点菜软件免费下载 编辑:程序博客网 时间:2024/05/22 13:39

一、定义存储基本数据类型的队列

1、创建文件LoopQueue.h ,定义表示队列的类

#ifndef LOOP_QUEUE_H#define LOOP_QUEUE_H/**环形队列的C++实现C++的类名并不比与类名相同**/class LoopQueue{public:    LoopQueue(int queueCapacity);//initQueue(&Q)创建队列    virtual ~LoopQueue();        //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 deQueue(int &element);              //deQueue(&Q element)首元素出队    void queueTraverse();        //queueTraverse(&Q,visit())遍历队列private:    int *m_lqueue;                 //队列数组首指针    int m_lqueueLen;               //队列长度    int m_lqueueCapacity;          //队列容量    int m_lqueueHead;    int m_lqueueTail;};#endif // LOOP_QUEUE
2、创建文件LoopQueue.cpp ,实现定义的方法

#include "MyQueue.h"#include <iostream>using namespace std;LoopQueue::LoopQueue(int queueCapacity){    m_lqueueCapacity = queueCapacity;    m_lqueue = new int[queueCapacity];    clearQueue();}LoopQueue::~LoopQueue(){    delete[] m_lqueue;    m_lqueue = NULL;}bool LoopQueue::queueEmpty()const{    return m_lqueueLen == 0?true:false;}bool LoopQueue::queueFull() const{   return  m_lqueueLen == m_lqueueCapacity?true:false;}int LoopQueue::queueLength()const{    return m_lqueueLen;}void LoopQueue::clearQueue(){    m_lqueueLen = 0;    m_lqueueHead = 0;    m_lqueueTail = 0;}bool LoopQueue::enQueue(int element){    if(queueFull())        return false;    m_lqueue[m_lqueueTail] = element;    m_lqueueTail++;    m_lqueueTail = m_lqueueTail % m_lqueueCapacity;    m_lqueueLen++;    return true;}bool LoopQueue::deQueue(int &element){    if(queueEmpty())        return false;    element = m_lqueue[m_lqueueHead];    m_lqueueHead++;    m_lqueueHead = m_lqueueHead % m_lqueueCapacity;    m_lqueueLen--;    return true;}/**遍历函数注意i循环的起点和终点是极易出错的**/void LoopQueue::queueTraverse(){    cout<<"遍历队列---------------------------------------"<<endl;    for(int i = m_lqueueHead;i < m_lqueueLen + m_lqueueHead;i++){        cout<<m_lqueue[i%m_lqueueCapacity]<<endl;    }    cout<<"遍历结束---------------------------------------"<<endl;}
3、在main函数中写如下代码,测试实现的队列是否正确

#include <iostream>#include "MyQueue.h"using namespace std;int main(){    LoopQueue *p = new LoopQueue(4);    p->enQueue(1);    p->enQueue(2);    p->enQueue(3);    p->enQueue(4);    p->enQueue(5);    p->queueTraverse();    int e = 0;    p->deQueue(e);    cout<<"e="<<e<<endl;    p->deQueue(e);    cout<<"e="<<e<<endl;    p->queueTraverse();    p->clearQueue();    p->queueTraverse();    p->enQueue(6);    p->enQueue(7);    p->queueTraverse();    delete p;    p =  NULL;    return 0;}
二、定义存储Object类型的队列

1、创建文件LoopQueue.h

#ifndef LOOP_QUEUE_H#define LOOP_QUEUE_H#include "Customer.h"/**环形队列的C++实现C++的类名并不比与类名相同**/class LoopQueue{public:    LoopQueue(int queueCapacity);//initQueue(&Q)创建队列    virtual ~LoopQueue();        //destoryQueue(&Q)销毁队列    void clearQueue();           //clearQueue(&Q)清空队列    bool queueEmpty() const;     //queueEmpty(&Q)判空队列    bool queueFull() const;      //queueFull(&Q)判满队列    int queueLength() const;     //queueLength(&Q)判断队列的长度    bool enQueue(Customer element);              //enQueue(&Q element)进入队列    bool deQueue(Customer &element);              //deQueue(&Q element)首元素出队    void queueTraverse();        //queueTraverse(&Q,visit())遍历队列private:    Customer *m_lqueue;                 //队列数组首指针    int m_lqueueLen;               //队列长度    int m_lqueueCapacity;          //队列容量    int m_lqueueHead;    int m_lqueueTail;};#endif // LOOP_QUEUE

2、创建文件LoopQueue.cpp

#include "MyQueue.h"#include <iostream>using namespace std;LoopQueue::LoopQueue(int queueCapacity){    m_lqueueCapacity = queueCapacity;    m_lqueue = new Customer[queueCapacity];    clearQueue();}LoopQueue::~LoopQueue(){    delete[] m_lqueue;    m_lqueue = NULL;}bool LoopQueue::queueEmpty()const{    return m_lqueueLen == 0?true:false;}bool LoopQueue::queueFull() const{   return  m_lqueueLen == m_lqueueCapacity?true:false;}int LoopQueue::queueLength()const{    return m_lqueueLen;}void LoopQueue::clearQueue(){    m_lqueueLen = 0;    m_lqueueHead = 0;    m_lqueueTail = 0;}/**由于Customer的成员变量并没有指针类型,所以不用使用使用深拷贝,默认的拷贝构造函数进行值赋值,就可以满足赋值的要求**/bool LoopQueue::enQueue(Customer element){    if(queueFull())        return false;    m_lqueue[m_lqueueTail] = element;    m_lqueueTail++;    m_lqueueTail = m_lqueueTail % m_lqueueCapacity;    m_lqueueLen++;    return true;}bool LoopQueue::deQueue(Customer &element){    if(queueEmpty())        return false;    element = m_lqueue[m_lqueueHead];    m_lqueueHead++;    m_lqueueHead = m_lqueueHead % m_lqueueCapacity;    m_lqueueLen--;    return true;}/**遍历函数注意i循环的起点和终点是极易出错的**/void LoopQueue::queueTraverse(){    cout<<"遍历队列---------------------------------------"<<endl;    for(int i = m_lqueueHead;i < m_lqueueLen + m_lqueueHead;i++){        m_lqueue[i%m_lqueueCapacity].printInfo();    }    cout<<"遍历结束---------------------------------------"<<endl;}
3、创建文件Customer.h

#ifndef CUSTOMER_H#define CUSTOMER_H#include <string>/**注意引入命名空间std这条语句一定要有,否则会提示string数据类型没有定义**/using namespace std;/**使用Object类型作为循环队列的存储对象**/class Customer{public:    //在初始化Customer类型的数组时必须有默认的构造参数,也可是使用带参的构造函数但要给出缺省时的默认值    Customer(string name = "",int age = 0);    void printInfo();private:    string m_strName;    int m_iAge;};#endif // CUSTOMER_H
4、创建文件Customer.cpp

#include "Customer.h"#include <iostream>using namespace std;Customer::Customer(string name,int age){    m_strName = name;    m_iAge = age;}void Customer::printInfo(){    cout<<"姓名"<<m_strName<<endl;    cout<<"年龄"<<m_iAge<<endl;}
5、在main函数里写入 如代码测试定义的队列是否正确

#include <iostream>#include "MyQueue.h"using namespace std;int main(){    LoopQueue *p = new LoopQueue(4);    Customer c1("张三",21);//注意不能使用new,使用new返回的是对象指针赋值时可能会出现问题    Customer c2("李四",22);    Customer c3("王五",23);    p->enQueue(c1);    p->enQueue(c2);    p->enQueue(c3);    p->queueTraverse();    Customer c4("",0);    p->deQueue(c4);    c4.printInfo();    p->queueTraverse();    delete p;    p = NULL;    return 0;}

1 0
原创粉丝点击