慕课网学习笔记之数据结构队列(C++)

来源:互联网 发布:同志交友软件 编辑:程序博客网 时间:2024/06/02 06:37

什么是队列呢?
是一种先进先出的数据结构
FIFO:first in first out
比如说日常生活中排队,此时的“队”就是队列,先排队的先出队,后排的后出。
这里写图片描述

这里写图片描述

相比于普通队列,环形队列对内存的使用更高效,推荐使用。

#ifndef QUEUE_H#define QUEUE_Hclass Queue{    public:        Queue(int quequeCapacity);      // 创建队列         virtual ~Queue();              // 销毁队列         void ClearQueue();              //清空队列         bool QueueEmpty() const;        //判空         bool QueueFull() const;         //判满         int QueueLength() const;        //获得队列长度         bool EnQueue( int element);     //入队         bool DeQueue( int &element);        //出队         void QueueTraverse();           //遍历队列     private:        int m_iQueueCapacity ;          //队列容量         int m_iHead;                    //队列头         int m_iTail;                    //队列尾         int m_iQueuelen;                //队列长度         int *m_pQueue;                  //队列指针 };#endif 
#include "queue.h"#include <iostream>using namespace std;Queue::Queue(int queueCapacity){    m_iQueueCapacity = queueCapacity;//此处传入队列总容量    m_pQueue = new int [m_iQueueCapacity]; //在堆上申请内存      ClearQueue();                   //清空队列}Queue::~Queue(){    delete []m_pQueue;             //销毁内存    m_pQueue = NULL;               //为了安全指为空}void Queue::ClearQueue()   //清空并不需要处理存入数据{                          //数据索引与使用依赖头长度    m_iHead =0;             //队列头置零    m_iTail = 0;            //队列尾置零    m_iQueuelen = 0; } bool Queue::QueueEmpty() const {    if(m_iQueuelen == 0)      return true;              //为空返回true    else    return false;               //否则false  }  bool Queue::QueueFull() const{    if(m_iQueuelen == m_iQueueCapacity)        return true;    else        return false; }int Queue::QueueLength() const{    return m_iQueuelen;}  bool Queue::EnQueue(int element){    if(QueueFull())            //入队先判满        return false;    else    {        m_pQueue[m_iTail] = element;//尾部入队        m_iTail++;                   //尾变长        m_iTail %= m_iQueueCapacity; //取余实现循环队列         m_iQueuelen++;               //长度变长        return true;    }}bool Queue::DeQueue(int &element){    if(QueueEmpty())           //出队则判空        return false;    else    {           element = m_pQueue[m_iHead];//头部出队    m_iHead++;                  //头改变     m_iHead %= m_iQueueCapacity;//取余实现循环    m_iQueuelen--;              //长度减一    return true;        }} void Queue:: QueueTraverse()//遍历要注意起始于结束{ //从Head开始,共遍历m_iQueuelen个,不能以Tail结尾  //因为Tail是会变化的,这里取余操作也是必不可少的    for(int i=m_iHead;i<m_iQueuelen+m_iHead;i++)    {      cout<<m_pQueue[i%m_iQueueCapacity]<<endl;    }}

以上两段代码分别是queue.h文件与queue.c中的代码,采用分文件定义的形式。
以下的代码为验证代码,为简单起见,队列装的是int型数据,当然队列中可以有更复杂的数据。

#include"queue.h"#include<iostream>using namespace std;int main(){    Queue * p = new Queue(4);    p->EnQueue(1);     p->EnQueue(11);     p->EnQueue(21);     p->EnQueue(12);     p->QueueTraverse();    int e=0;    p->DeQueue(e);      cout<< "删除的是:"<<e<<endl;     p->QueueTraverse();    p->DeQueue(e);      cout<< "删除的是:"<<e<<endl;     p->QueueTraverse();    p->DeQueue(e);      cout<< "删除的是:"<<e<<endl;     p->QueueTraverse();    p->DeQueue(e);      cout<< "删除的是:"<<e<<endl;     p->QueueTraverse();    p->ClearQueue();    cout <<endl;     cout <<"已清空"<<endl;     p->QueueTraverse();        cout <<endl;     cout <<"再入队"<<endl;     p->EnQueue(111);     p->EnQueue(112);     p->EnQueue(211);     p->EnQueue(122);     p->QueueTraverse();    delete []p;    p=NULL;    return 0; } 

这是Dev C++编译运行的结果
这里写图片描述

0 0