队列的循环数组实现

Posted cs0915

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了队列的循环数组实现相关的知识,希望对你有一定的参考价值。

这里初始化的队列的front一直指向队头,rear一直指向队尾。

  1 #include "pch.h"
  2 #include <iostream>
  3 #include <stdlib.h>
  4 using namespace std;
  5 
  6 #define MinQueueSize 5    //限定队列的最小容量
  7 
  8 struct QueueRecord        //记录队列的相关信息
  9 {
 10     int cap;    
 11     int front;
 12     int rear;
 13     int size;//目前队列大小
 14     int* array;
 15 };
 16 typedef struct QueueRecord* queue;
 17 
 18 //创建一个空队列,自定义容量
 19 queue create_empty_queue(int capacity)
 20 {
 21     if (capacity < MinQueueSize)
 22         cout << "请指定更大的容量" << endl;
 23     else
 24     {
 25         queue Q = (queue)malloc(sizeof(struct QueueRecord));
 26         Q->cap = capacity;
 27         Q->array = (int*)malloc(sizeof(int)*capacity);
 28         Q->size = 0;
 29         Q->front = 1;
 30         Q->rear = 0;//初始化front和rear,rear位于front后面
 31         return Q;
 32     }
 33     
 34 }
 35 //检测队列是否为空
 36 bool isempty(queue Q)
 37 {
 38     return Q->size == 0;
 39 }
 40 //检测队列是否为满
 41 bool isfull(queue Q)
 42 {
 43     return Q->size == Q->cap;
 44 }
 45 //释放队列
 46 void dispose_queue(queue Q)
 47 {
 48     if (Q != NULL)
 49     {
 50         free(Q->array);
 51         free(Q);
 52     }
 53 }
 54 //返回队列长度
 55 int length_queue(queue Q)
 56 {
 57     return Q->size;
 58 }
 59 //判断front或rear是否到达了数组的末端,若是则绕回开头
 60 int Succ(int &value, queue Q)
 61 {
 62     if (++value == Q->cap)
 63         value = 0;
 64     return value;
 65 }
 66 //入队
 67 void Enqueue(queue Q,int x)
 68 {
 69     if (isfull(Q))
 70         cout << "队列已满" << endl;
 71     else
 72     {
 73         Q->size++;
 74         Q->rear = Succ(Q->rear, Q);
 75         Q->array[Q->rear] = x;
 76     }
 77 }
 78 //出队
 79 void Dequeue(queue Q)
 80 {
 81     if (isempty(Q))
 82         cout << "队列已空" << endl;
 83     else
 84     {
 85         Q->size--;
 86         Q->front = Succ(Q->front, Q);
 87     }
 88 }
 89 //返回队头的值
 90 int value_front(queue Q)
 91 {
 92     if (isempty(Q))
 93         cout << "队列为空" << endl;
 94     else
 95         return Q->array[Q->front];
 96 }
 97 int value_rear(queue Q)
 98 {
 99     if (isempty(Q))
100         cout << "队列为空" << endl;
101     else
102         return Q->array[Q->rear];
103 }
104 int main()
105 {
106     queue Q=create_empty_queue(5);
107     if (isempty)
108         cout << "这是一个空队列" << endl;
109     Dequeue(Q);
110     for (int i = 0; i < 6; i++)
111         Enqueue(Q, i);
112     cout << value_front(Q) << " " << value_rear(Q) << endl;
113     system("pause");
114     return 0;
115 
116 }

运行结果:

技术图片

以上是关于队列的循环数组实现的主要内容,如果未能解决你的问题,请参考以下文章

go语言循环队列的实现

最强解析面试题:Goland 循环队列实现

循环队列的实现及细节

Java用数组实现循环队列

数据结构 - 数组模拟非循环和循环队列(Java实现)

线性结构 —— 循环数组