数组型队列(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
相关文章推荐
- Leetcode 17. Letter Combinations of a Phone Number
- C++第五次实验-项目1:数组分离
- leetcode 206 Reverse Linked List C++
- 标准C++中的string类的用法总结
- Effective C++ 改善程序与设计的55个具体做法之条款33
- C++中 #ifdef 和#endif的作用
- Java语法:与c++不同的地方
- leetcode 169 Majority Element C++
- C++获取系统当前时间(精确到微秒)
- c++字符串的分割保存
- C++11 Regex正则表达式初探
- C++拷贝构造函数详解
- 建立简单的系统模型
- leetcode笔记:Dungeon Game
- C++ VARIANT数据类型操作详解
- C++中为什么有时候会出现使用cin后在再使用getchar()会没有用
- C++练习题
- String类的构造函数和析构函数
- C++第五次实验(数组分离)
- C++第五次作业