C++循环双端队列

来源:互联网 发布:wifi指纹定位算法 编辑:程序博客网 时间:2024/05/16 01:18

要理解循环双端队列,必须将这个名词分开来理解。

首先是循环队列,循环对列的top指针指向第一个插入队列的元素,rear指针指向后面插入的元素。并且为了避免“假溢出”,top指针一般指向当前元素的下一个元素,而rear指针则指向当前插入的元素。

然后是双端队列,双端队列是在队列的基础之上,头尾都可以进行操作的线性表,也就是说可以在头尾进行删除和插入操作。

最后再把这两个概念结合起来,你就能理解了。

下面是实现一个循环双端队列的代码:

// DoubleQueue.cpp : 定义控制台应用程序的入口点。////因为循环队列为了避免出现“假溢出”所以,top指针总是指向一个空元素(即:当前位置的前一个位置),而rear指向当前位置。#include "stdafx.h"#include <iostream>#include <assert.h>#include <iomanip>using namespace std;template <typename T>class DoubleQueue{private:int end1,end2;  //end1,end2为两个端点,end1相当于队列中的rear,end2相当于top。T *data;  //队列的值int size;//队列的大小public:DoubleQueue(int sz = 10);~DoubleQueue(){delete[] data;}void EnQueue(T item,int end);  //从队列中插入元素void DelQueue(int end);  //从队列中删除元素bool IsEmpty(){ return end1 == end2;}bool IsFull(){ return (end1+1)%size == end2;}void List(int end);  //列出队列中所有元素};template <typename T>DoubleQueue<T>::DoubleQueue(int sz):end1(0),end2(0),size(sz){data = new T[this->size];assert(data!=0);//如果data不是指到第0个元素,则断言。}//循环双端队列的插入操作template <typename T>void DoubleQueue<T>::EnQueue(T item,int end){assert( !IsFull() );if( 1 == end ){end1 = (end1+1)%size;data[end1] = item;}else{data[end2] = item;end2 = (end2-1+size)%size;}}//循环双端队列的删除操作//删除元素的时候,只需要指定从哪端删除template<typename T>void DoubleQueue<T>::DelQueue(int end){assert( !IsEmpty() );if( 1 == end ){end1 = (end1-1+size)%size;}else{end2 = (end2+1)%size;}}//循环双端队列的输出操作template<typename T>void DoubleQueue<T>::List(int end){if( 1 == end ){for(int p = end1; p != end2; p = (p-1+size)%size )cout<<setw(3)<<data[p];cout<<endl;}else{for(int p = (end2+1)%size; p != end1; p = (p+1)%size )cout<<setw(3)<<data[p];cout<<endl;}}//循环双端队列的测试int _tmain(int argc, _TCHAR* argv[]){DoubleQueue<int> dq;//向队列end1中插入元素dq.EnQueue(2,1);dq.EnQueue(3,1);dq.EnQueue(4,1);dq.EnQueue(5,1);cout<<"输出向队列中end1插入元素后的结果:"<<endl;dq.List(1);cout<<"删除队列的end1最后两个元素后的队列:"<<endl;dq.DelQueue(1);dq.DelQueue(1);dq.List(1);//向队列end1中插入元素dq.EnQueue(6,2);dq.EnQueue(7,2);dq.EnQueue(8,2);dq.EnQueue(9,2);cout<<"输出向队列中end2插入元素后的结果:"<<endl;dq.List(2);cout<<"删除队列的end2最后两个元素后的队列:"<<endl;dq.DelQueue(2);dq.DelQueue(2);dq.List(2);return 0;}

你明白了吗?

有什么问题希望大家提出来,谢谢!

原创粉丝点击