您的位置:首页 > 编程语言 > C语言/C++

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

2016-05-05 19:55 197 查看

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

最近用到了数据结构中的queue,标准模板库STL里面的queue是指针型队列,不支持访问队列中的任意元素。故网上找了很多代码,其中

/article/9684488.html

基本实现了我想要的功能,但使用起来比较麻烦。我便在该文代码的基础上,调试了bug,并将代码封装到了一个模板里。

下载链接:http://download.csdn.net/detail/michaelliang12/9511253

使用方法如下:

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

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

/article/8217901.html

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

四、参考博客

/article/9684488.html

/article/8217901.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: