模板队列Queue类
2015-06-19 21:07
357 查看
最近,学习了c++中的模板,自己写了一个关于队列类的模板,经过我的测试,它可以用于int ,double,char等类型。
首先,我定义了一个关于顺序队列类的模板,声明了其中的一些函数,用以实现先进先出,入队、出队,判断为空、为满等基本的操作。
下面是有关这些函数的定义。需要注意的是在类外定义模板类的成员函数时,需要先写template<参数列表>
为了改进队列类的一些缺点,将队列设为循环队列,这时num 就不是队列的最大容量,而为队列的容量+1.以下为循环队列的模板:
以下为我关于所设计的模板队列类的一些测试
首先,我定义了一个关于顺序队列类的模板,声明了其中的一些函数,用以实现先进先出,入队、出队,判断为空、为满等基本的操作。
<pre name="code" class="cpp"><pre name="code" class="cpp">template<typename T,int num> class Queue { public: Queue() :front_(0),rear_(0) {} bool isEmpty();//判断是否为空 bool isFull();//判断是否为满 bool push(const T &); bool pop(T &); int & getfront() { return front_; } int & getrear() { return rear_; } private: int front_; int rear_; T arr_[num]; };
下面是有关这些函数的定义。需要注意的是在类外定义模板类的成员函数时,需要先写template<参数列表>
template<typename T,int num> bool Queue<T,num>::isEmpty() { return (front_ == rear_); } template<typename T,int num> bool Queue<T,num>::isFull() { return(rear_ - front_ == num); } template<typename T,int num> bool Queue<T,num>::push(const T &val)//入队 { if(isFull()) return false; else { arr_[rear_] = val; rear_ ++; return true; } } template<typename T,int num> bool Queue<T,num>::pop(T &val)//出队 { if(isEmpty()) return false; else { val = arr_[front_]; ++front_; return true; } }
为了改进队列类的一些缺点,将队列设为循环队列,这时num 就不是队列的最大容量,而为队列的容量+1.以下为循环队列的模板:
template<typename T,int num> class MyQueue { public: MyQueue() { front_ = rear_ = 0; }; bool isEmpty() { return (front_ == rear_); } bool isFull() { return ((rear_ + 1) % num == front_); } bool push(const T &val) { if(isFull()) return false; else { rear_ = (rear_ + 1)%num; arr_[rear_] = val; // std::cout<<rear_<<" "; return true; } } bool pop(T &val) { if(isEmpty()) return false; else { front_ = (front_ + 1) % num; val = arr_[front_]; // std::cout<<front_<<" "; return true; } } int & getfront() { return front_; } int & getrear() { return rear_; } private: int rear_; int front_; T arr_[num]; };
以下为我关于所设计的模板队列类的一些测试
int main(void) { Queue<int,10>queueInt; std::cout<<"开始时,是否为空?"<<queueInt.isEmpty()<<std::endl; queueInt.push(5); std::cout<<"开始时,是否为空?"<<queueInt.isEmpty()<<std::endl; std::cout<<"the front = "<<queueInt.getfront()<<",the rear = "<<queueInt.getrear()<<std::endl; for(int idx = 0; idx != 9;++idx) { queueInt.push(idx); } std::cout<<"此时,是否为满?"<<queueInt.isFull()<<std::endl; int rec = 0; while(queueInt.pop(rec)) { std::cout<<rec<<" "; } std::cout<<std::endl; MyQueue<char,26>queueChar;//循环队列中最多有num-1个元素 for(char idx = 'a';idx != 'z';idx++) { queueChar.push(idx); } std::cout<<"queueChar是否为空?"<<queueChar.isEmpty()<<std::endl; std::cout<<"queueChar是否为满?"<<queueChar.isFull()<<std::endl; char cval; while(queueChar.pop(cval)) { std::cout<<cval<<" "; } std::cout<<std::endl; return 0; }
相关文章推荐
- Android Native 绘图方法
- C#中struct和class的区别详解
- VBS ArrayList Class vbs中的数组类
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 深入了解PHP类Class的概念
- setAttribute 与 class冲突解决
- JavaScript中的类(Class)详细介绍
- javascript面向对象包装类Class封装类库剖析
- jQuery使用hide方法隐藏指定元素class样式用法实例
- jQuery给多个不同元素添加class样式的方法
- JavaScript更改class和id的方法
- 一篇入门的php Class 文章
- 深入C++中struct与class的区别分析
- js中设置元素class的三种方法小结
- c++中typename和class的区别介绍
- php class类的用法详细总结
- Windows平台的 PHP 报错 Fatal error: Class COM not found in 的解决方法
- JavaScript跨浏览器获取页面中相同class节点的方法
- js实现class样式的修改、添加及删除的方法
- Javascript定义类(class)的三种方法详解