循环队列

  1 #include
  2
  3 typedef int Status;
  4 #define DEFAULT_SIZE 0
  5 #define SUCCESS 1
  6 #define OVER_FLOW 0
  7
  8 //队列的类模板
  9 template<class ElemType>
 10 class SeqQueue {
 11 protected:
 12     int front, rear;    //队头队尾指针(数组下标)
 13     int maxSize;            //队列的容量
 14     ElemType* elems;        //元素的存储空间(ElemType类型的数组,elems数组名)
 15 public:
 16     SeqQueue(int size = DEFAULT_SIZE);        //构造函数
 17     virtual ~SeqQueue();                    //析构函数
 18     int GetLength() const;                    //求队列长度(函数名后跟const是为了使用此函数时不改变成员变量)
 19     bool IsEmpty() const;                    //判断是否为空
 20     void Clear();                            //清空
 21     void Traverse(void(*Visit)(const ElemType&)) const;        //遍历队列
 22     Status DelQueue(ElemType& e) const;        //出队
 23     Status GetHead(ElemType& e) const;        //取队头操作
 24     Status EnQueue(const ElemType e);        //入队操作
 25 };
 26
 27 template <class ElemType>        //构造函数实现
 28 SeqQueue::SeqQueue(int size)
 29 {
 30     elems = new ElemType[size];
 31     maxSize = size;
 32     front = rear = 0;
 33 }
 34
 35 template <class ElemType>        //析构函数实现
 36 SeqQueue::~SeqQueue()
 37 {
 38     delete[] elems;
 39 }
 40
 41 template <class ElemType>        //求队列长度函数实现
 42 int SeqQueue ::GetLength() const
 43 {
 44     return (rear - front + maxSize) % maxSize;    //此处建议画图自己领悟,设计很巧妙
 45 }
 46
 47 template <class ElemType>        //判断队列是否为空函数实现
 48 bool SeqQueue ::IsEmpty() const
 49 {
 50     if(front == rear){return true;}
     else {return false;}
51 } 52 53 template <class ElemType> //将队列清空函数实现 54 void SeqQueue ::Clear() 55 { 56 rear = front = 0; 57 } 58 59 template <class ElemType> //遍历队列函数实现 60 void SeqQueue ::Traverse(void (*Visit)(const ElemType&)) const 61 { 62 for (int i = front; i != rear; i = (i + 1) % maxSize) 63 { 64 (*Visit)(elems[i]); 65 } 66 } 67 68 template <class ElemType> //出队函数实现 69 Status SeqQueue ::DelQueue(ElemType& e) const 70 { 71 if (IsEmpty()) 72 return true; 73 else 74 { 75 e = elems[front]; 76 front = (front + 1) % maxSize; 77 } 78 } 79 80 template <class ElemType> //取队头操作函数实现 81 Status SeqQueue ::GetHead(ElemType& e) const 82 { 83 if (IsEmpty()) 84 return false; 85 else 86 { 87 e = elems[front]; 88 return true; 89 } 90 } 91 92 template <class ElemType> //入队函数实现 93 Status SeqQueue ::EnQueue(const ElemType e) 94 { 95 if ((rear + 1) % maxSize == front) //队列已满,返回错误 96 return OVER_FLOW; 97 else { 98 elems[rear] = e; 99 rear = (rear + 1) % maxSize; 100 return SUCCESS; 101 } 102 }
return false;

Original: https://www.cnblogs.com/JIAcheerful/p/16152925.html
Author: 云霄雨霁
Title: 循环队列

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622685/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球