数组型队列(queue)的使用(支持自定义数据类型)(C++版)

来源:互联网 发布:ucosiii软件定时器 编辑:程序博客网 时间:2024/05/02 00:23

数组型队列(queue)的使用(支持自定义数据类型)(C++版)

最近用到了数据结构中的queue,标准模板库STL里面的queue是指针型队列,不支持访问队列中的任意元素。故网上找了很多代码,其中
http://blog.csdn.net/juckciy/article/details/23787277
基本实现了我想要的功能,但使用起来比较麻烦。我便在该文代码的基础上,调试了bug,并将代码封装到了一个模板里。
下载链接:http://download.csdn.net/detail/michaelliang12/9511253
使用方法如下:

一、将MyDeque.template文件拷入工程目录

这是我修改的名为MyDeque的队列类,大家可以在此基础上修改。至于为什么没有封装为.cpp和.h,是因为本代码支持自定义的数据类型,需要使用模板,而模板不支持分离编译。可参考
http://blog.csdn.net/checkin001/article/details/26454327

//MyDeque.template#include "stdafx.h"#include <iostream>#include <string>#include <cassert>using namespace std;/*用数组实现循环队列(1)、设一标志位以区别队列是“空”还是“满”(2)、少用一空间,约定“队列头指针在队尾指针的下一位置”上作为队列呈“满”状态的标志*/template <typename T>class MyDeque{public:    MyDeque(int n = 10);//构造函数    bool EnterQueue(T element);//向队列插入元素    bool DeleteQueue(T &element);//从队列弹出元素    int GetQueueLength();//返回队列的长度    bool GetQueueValue(T &element, int index);//返回队列的第number个值private:    int front; //对头指针    int rear;  //队尾指针    T *base; //动态分配的内存指针    int maxsize; //最大队列长度};template <typename T>MyDeque<T>::MyDeque(int n){    base = (T*)new T[n];    assert(base != NULL);    memset(base, 0, n);    front = rear = 0; //队头和队尾指针分别指向地一个元素    maxsize = n;}template <typename T>bool MyDeque<T>::EnterQueue(T element){    if ((rear + 1) % maxsize == front) //判断队列是否满    {        return false;    }    else    {        base[rear] = element;        rear = (rear + 1) % maxsize;        return true;    }}template <typename T>bool MyDeque<T>::DeleteQueue(T &element){    if (front == rear)//判断队列是否为空    {        return false;    }    else    {        element = base[front];        base[front] = NULL;        front = (front + 1) % maxsize;        return true;    }}template <typename T>int MyDeque<T>::GetQueueLength()//获得队列长度{    return (rear - front + maxsize) % maxsize;}template <typename T>bool MyDeque<T>::GetQueueValue(T &element, int index)//获得队列第number个值的大小,0<=index<QueueLength(){    if(index >= GetQueueLength())    {       return false;    }    else    {            element = base[index];        return true;    }}

二、加入头文件#include “MyDeque.template”

mian.cpp 示例函数如下

#include "stdafx.h"#include <iostream>using namespace std;#include "MyDeque.template"void main(){    MyDeque<int> my(10);    int i;    for (i = 0; i<5; i++)    {        my.EnterQueue(i + 1);    }    cout << "队列长度:" << my.GetQueueLength() << endl;    int element;    if (my.GetQueueValue(element, 2))//0<=index<QueueLength()    {        cout << "队列的第3个元素为" << element << endl;    }    else    {        cout << "不存在此元素!" << endl;    }    if (my.DeleteQueue(element))    {        cout << "删除的元素为" << element << endl;    }    else    {        cout << "删除失败!" << endl;    }    cout << "队列长度:" << my.GetQueueLength() << endl;    system("pause");}

三、完整示例程序下载

http://download.csdn.net/detail/michaelliang12/9511253

四、参考博客

http://blog.csdn.net/juckciy/article/details/23787277
http://blog.csdn.net/checkin001/article/details/26454327

0 0