C++实现循环队列

 更新时间:2020年01月13日 11:42:19   作者:My_Algorithm  
这篇文章主要为大家详细介绍了C++实现循环队列,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现循环队列的具体代码,供大家参考,具体内容如下

circularQueue.h

#pragma once
#pragma once
#ifndef CIRCULARQUEUE_H
#define CIRCULARQUEUE_H
 
#include<iostream>
#include<ostream>
using std::cout;
using std::cin;
using std::endl;
using std::ostream;
template<class T> class cirQueue;
 
template<typename T>
class cirQueue
{
public:
 cirQueue(int sz);
 ~cirQueue();
 void push(const T& elem);//进队
 void pop(T& elem);//出队
 bool empty();//查看队列是否为空
 int getSize();//返回队列中元素的个数
 void clearQueue();//清空队列中的元素
 void print();//打印队列中的元素
 int getfront() { return front; }
 int getrear() { return rear; }
 bool getTop(T& elem);//读取队列首个元素
 
 template<typename T>
 friend ostream& operator<<(ostream& os, cirQueue<T>& queue);
 
private:
 bool _full()const;//判断队列是否已满
 int maxsize;//队列最大的空间
 T* element;//存放于队列中的元素数组
 int front;//模拟队头指针
 int rear;//模拟队尾指针
};
 
 
template<typename T>
cirQueue<T>::cirQueue(int sz) {
 maxsize = sz;
 element = new T[maxsize];
 if (element == nullptr)
 cout << "内存分配失败" << endl;
 front = 0;
 rear = 0;
}
 
 
template<typename T>
cirQueue<T>::~cirQueue() {
 if (element != nullptr)
 delete element;
}
 
//进队
template<typename T>
void cirQueue<T>::push(const T& elem) {//需要保证队尾指针位置与首个元素相差一个位置
 if (rear > (maxsize - 1))
 rear -= maxsize ;
 if (front > (maxsize - 1))
 front -= maxsize ;
 if (!_full()) {//队列未满的情况 
 element[rear++] = elem;//队尾向后移动一位
 //++rear;
 }
 else {
 cout << "队列已满,不能插入!" << endl;
 return;
 }
}
 
//出队
template<typename T>
void cirQueue<T>::pop(T& elem) {
 if (rear > (maxsize - 1))
 rear -= (maxsize - 1);
 if (front > (maxsize - 1))
 front -= (maxsize - 1);
 if (!empty()) {//队列未空的情况
 elem = element[front++];//队头向后移动一位
 element[front - 1] = 0;//置零
 }
 else {
 cout << "队列已空!" << endl;
 return;
 }
}
 
//查看队列是否为空
template<typename T>
bool cirQueue<T>::empty() {
 if (front == rear)//待定
 return true;
 return false;
}
 
//返回队列中元素的个数
template<typename T>
int cirQueue<T>::getSize() {
 int num = 0;
 if (front <= rear)
 return rear - front;
 else
 return maxsize - front + rear + 1;
}
 
//清空队列中的元素
template<typename T>
void cirQueue<T>::clearQueue() {
 if (!empty())
 {
 int Index = 0;
 while (front < rear) {//front逼近rear
  element[front++] = 0;
  if (front == rear)
  return;
 }
 if (rear < front) {
  while (front <= maxsize - 1)//删除front至数组尾端的数据
  element[front++] = 0;
  front -= maxsize;
  while (front < rear) {//删除front至rear的数据
  element[front++] = 0;
  if (front == rear)
   return;
  }
 }
 }
}
 
//打印队列中的元素
template<typename T>
void cirQueue<T>::print() {//与clearQueue函数原理一致,将front替换为Index
 if (!empty())
 {
 int Index = front;
 while (Index < rear) {
  cout << element[Index++] << " ";
  if (Index == rear) {
  cout << endl;
  return;
  }
 }
 if (rear < Index) {
  while (Index <= maxsize - 1)
  cout << element[Index++] << " ";
  Index -= maxsize;
  while (Index < rear) {
  cout << element[Index++] << " ";
  if (Index == rear) {
   cout << endl;
   return;
  }
  }
 }
 }
}
 
//读取队列首个元素
template<typename T>
bool cirQueue<T>::getTop(T& elem) {
 if (!empty()) {
 elem = element[front];
 return true;
 }
 return false;
}
 
template<typename T>
ostream& operator<<(ostream& os, cirQueue<T>& queue) {
 os << "队列中的元素数量为:" << queue.getSize() << endl;
 return os;
}
 
//判断队列是否已满
template<typename T>
bool cirQueue<T>::_full()const {
 if (front - rear == 1 || front - rear == -maxsize + 1)
 return true;
 return false;
}
 
#endif // !CIRCULARQUEUE_H

main.cpp

#include"CircularQueue.h"
 
 
int main()
{
 cirQueue<int> cq(20);
 int a = 0;
 for (int i = 0; i < 19; i++)
 {
 cq.push(i);
 }
 cq.print();
 cout << cq;
 for (int i = 0; i < 20; i++)
 {
 cq.pop(a);
 }
 cout << cq;//此时front=rear=19
 cout << cq.getfront() << "  " << cq.getrear() << endl;
 //for (int i = 19; i < 25; i++)
 //{
 // cq.push(i);
 //}
 cq.push(19);
 cq.print();
 cout << cq.getfront() << "  " << cq.getrear() << endl;
 cout << endl << endl;
 cq.push(20); 
 cq.getTop(a);
 cout << a << endl;
 cq.print();
 cout << cq.getfront() << "  " << cq.getrear() << endl;
 return 1;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • windows下在vim中搭建c语言开发环境的详细过程

    windows下在vim中搭建c语言开发环境的详细过程

    这篇文章主要介绍了windows下在vim中搭建c语言开发环境,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 基于C++浮点数(float、double)类型数据比较与转换的详解

    基于C++浮点数(float、double)类型数据比较与转换的详解

    本篇文章是对C++中浮点数(float、double)类型数据比较与转换进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言数据结构顺序表的进阶讲解

    C语言数据结构顺序表的进阶讲解

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-04-04
  • C++ 函数重载背后的原理

    C++ 函数重载背后的原理

    这篇文章主要介绍了C++ 函数重载背后的原理,我们不仅仅需要学会重载的使用,更要了解C++为什么支持函数重载,下面我们一起进入文章学习该内容吧
    2022-05-05
  • c++ decltype关键字的用法

    c++ decltype关键字的用法

    这篇文章主要介绍了c++ decltype关键字的用法,帮助大家更好的理解和学习c++,感兴趣的朋友可以了解下
    2020-10-10
  • C指针原理教程之语法树及其实现

    C指针原理教程之语法树及其实现

    本文给大家分享的是如何使用C语言的指针原来来实现语法树,并给大家提供了详细的实例代码,希望大家能够喜欢
    2019-02-02
  • C语言实现烟花表白程序代码

    C语言实现烟花表白程序代码

    大家好,本篇文章主要讲的是C语言实现烟花表白程序代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++中的三种继承public,protected,private详细解析

    C++中的三种继承public,protected,private详细解析

    我们已经知道,在基类以private方式被继承时,其public和protected成员在子类中变为private成员。然而某些情况下,需要在子类中将一个或多个继承的成员恢复其在基类中的访问权限
    2013-09-09
  • C++求所有顶点之间的最短路径(用Floyd算法)

    C++求所有顶点之间的最短路径(用Floyd算法)

    这篇文章主要为大家详细介绍了C++求所有顶点之间的最短路径,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • 简述C语言中system()函数与vfork()函数的使用方法

    简述C语言中system()函数与vfork()函数的使用方法

    这篇文章主要介绍了简述C语言中system()函数与vfork()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08

最新评论