循环队列的使用·数据结构

简介: 在讲循环队列之前,先来聊聊队列吧队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。而循环队列是什么呢?由于队列存在着假溢出(即队列未满,但是尾指针到了末尾的位置,使队列无法再进行入队的操作)。为了解决假溢出,程序员发明了循环队列,使头尾指针的使用更加的灵活,可以有效地解决假溢出的问题。

在讲循环队列之前,先来聊聊队列吧

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。


而循环队列是什么呢?由于队列存在着假溢出(即队列未满,但是尾指针到了末尾的位置,使队列无法再进行入队的操作)。为了解决假溢出,程序员发明了循环队列,使头尾指针的使用更加的灵活,可以有效地解决假溢出的问题。


在循环队列中,实现的最关键的步骤是模运算

a8be94237a6f4a2e91c1810afe1d5832.png

我们先来看看头文件的代码吧

头文件:

#pragma once
#include<iostream>
using namespace std;
#define MAXSIZE 100
//循环队列类
class CyclicQ {
private:
  int* data;//数组
  int front;//队头指针
  int rear;//队尾指针
public:
  //初始化
  void Init() {
    data = new int[MAXSIZE];
    front = rear = 0;
  }
  //求当前队列长度
  int Getlen() {
    return (rear - front + MAXSIZE) % MAXSIZE;
  }
  //输出
  void Output() {
    int len = Getlen();
    cout << "队列长度:" << len << endl;
    if (len > 0) {
      cout << "队列内容:" << endl;
      int index = (front + 1) % MAXSIZE;//指向第一个元素
      for (int i = 0; i < len; i++) {
        cout << data[index] << "|";
        index = (index + 1) % MAXSIZE;
      }
      cout << endl;
    }
  }
  //入队
  void EnQueue(int value) {
    rear = (rear + 1) % MAXSIZE;
    data[rear] = value;
  }
  //出队
  int DeQueue() {
    front = (front + 1) % MAXSIZE;
    return data[front];
  }
  //判空
  bool isEmpty() {
    return(front == rear) ? true : false;
  }
  //判满
  bool isFull() {
    return (front == ((rear + 1) % MAXSIZE)) ? true : false;
  }
  //销毁
  void Destroy() {
    delete[]data;
  }
  //取队头元素
  int GetTop() {
    int temp = (front + 1) % MAXSIZE;
    return data[temp];
  }
};

头文件包含了一个数组,头尾指针以及一系列的函数,读者们仔细阅读可以清楚的理解它们

再看看main函数

main函数:

#include<iostream>
#include"严严的循环队列.h"
using namespace std;
int main()
{
  CyclicQ c;
  c.Init();
  c.Output();
  cout << "队空?" << c.isEmpty() << endl;
  cout << "队满?" << c.isFull() << endl;
  for (int i = 1; i <= 99; i++) {
    c.EnQueue(i);
  }
  c.Output();
  for (int i = 1; i <= 50; i++) {
    int t = c.DeQueue();
    cout << "出队元素:" << t << endl;
  }
  c.Output();
  cout << c.GetTop() << endl;
  cout << "队空?" << c.isEmpty() << endl;
  cout << "队满?" << c.isFull() << endl;
  system("pause");
  return 0;
}

57a1cde30cdb44f1aeb3a362fdc738d3.png

PS:简单易懂

明天将更新杨辉三角(用队列的方式实现)

相关文章
|
7月前
|
存储 Java 容器
深入浅出 栈和队列(附加循环队列、双端队列)
深入浅出 栈和队列(附加循环队列、双端队列)
|
7月前
|
存储
【数据结构】循环队列
【数据结构】循环队列
62 0
|
7月前
|
算法 调度 C++
【C/C++ 数据结构 线性表】C/C++中队列的原理与实现:从基础到循环队列
【C/C++ 数据结构 线性表】C/C++中队列的原理与实现:从基础到循环队列
154 0
数据结构第九弹---循环队列
数据结构第九弹---循环队列
|
算法 C语言
【数据结构】循环队列
文章目录 📑前言 🍁一、循环队列的结构 💭 二、循环队列的操作 1.定义循环队列 2.创建循环队列 3.判断满
|
存储 算法 编译器
【霍洛维兹数据结构】栈和队列 | 动态循环队列 | 迷宫问题 | 表达式 | 多重栈&多重队列
【霍洛维兹数据结构】栈和队列 | 动态循环队列 | 迷宫问题 | 表达式 | 多重栈&多重队列
89 0
|
6月前
|
存储 算法
【数据结构和算法】--队列的特殊结构-循环队列
【数据结构和算法】--队列的特殊结构-循环队列
34 0
|
2月前
|
存储
【初阶数据结构】深入解析循环队列:探索底层逻辑
【初阶数据结构】深入解析循环队列:探索底层逻辑
|
5月前
|
存储 索引
【数据结构OJ题】设计循环队列
力扣题目——设计循环队列
38 1
【数据结构OJ题】设计循环队列
|
4月前
|
算法
【数据结构与算法】循环队列
【数据结构与算法】循环队列
26 0