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;
}

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

相关文章

  • C语言趣味编程之平分七筐鱼

    C语言趣味编程之平分七筐鱼

    这篇文章介绍了C语言趣味编程之平分七筐鱼,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • C语言线性表中顺序表超详细理解

    C语言线性表中顺序表超详细理解

    程序中经常需要将一组数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化,顺序表则是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由它们的存储顺序自然表示
    2022-03-03
  • C语言实现父进程主动终止子进程的方法总结

    C语言实现父进程主动终止子进程的方法总结

    一般的情况,子进程自己运行完后,执行exit 或者return 后,父进程wait.  waitpid收回子进程,但子进程是一个循环等待状态不主动退出,父进程可以采用文中介绍的几种方法,需要的朋友可以参考下
    2023-10-10
  • C++隐式类型转换运算符operator type()用法详解

    C++隐式类型转换运算符operator type()用法详解

    这篇文章主要介绍了C++隐式类型转换运算符operator type()用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 一篇文章带你入门C语言:函数

    一篇文章带你入门C语言:函数

    这篇文章主要介绍了C语言中函数的声明、定义及使用的入门教程,重点讲述了main函数的相关知识,需要的朋友可以参考下,希望能给你带来帮助
    2021-08-08
  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解

    这篇文章主要为大家详细介绍了人脸检测中AdaBoost算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C++超详细讲解逗号操作符

    C++超详细讲解逗号操作符

    使用逗号运算符是为了把几个表达式放在一起。整个逗号表达式的值为系列中最后一个表达式的值。从本质上讲,逗号的作用是将一系列运算按顺序执行
    2022-05-05
  • C++哈希表之线性探测法实现详解

    C++哈希表之线性探测法实现详解

    线性探测法的优点:只要散列表未满,总能找到一个不冲突的散列地址;缺点:每个产生冲突的记录被散列到离冲突最近的空地址上,从而又增加了更多的冲突机会
    2022-05-05
  • C++基于OpenCV实现手势识别的源码

    C++基于OpenCV实现手势识别的源码

    这篇文章主要介绍了C++基于OpenCV手势识别的实现源码,这里用到背景减法模型知识,具体实例代码跟随小编一起看看吧
    2021-09-09
  • C++实现学生选课系统

    C++实现学生选课系统

    这篇文章主要为大家详细介绍了C++实现学生选课系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02

最新评论