循环队列

Posted on 2023-09-05 21:31  jacyoier  阅读(29)  评论(0)    收藏  举报

一、循环队列概述

循环队列 是把顺序队列首尾相连,把存储队列元素的表从逻辑上看成一个环,成为循环队列。
队头指针(front) 指向队列的队头元素。
队尾指针(rear) 指向队列的最后一个元素的下一个元素。
pBase 指向块内存的首地址

 

判断队列空:if(front==rear&&front==0)

判断队列满:if(front=(rear+1)%n)

插入:rear=(rear+1)%n

删除:front=(front+1)%n

二、循环队列存储结构

在顺序实现是 队尾指针和队头指针指的就是下标

1、初始化循环队列

 

2、返回队列中已有元素个数

 

3、判断循环队列是否为满

4、将元素e进行入队

 

5、判断循环队列是否为空

 

6、遍历队内所有元素

 

7、出队,出队元素由e返回

 

8、清空队列

 

9、销毁队列

 完整代码

  1 // 循环队列.cpp 
  2 # include<stdio.h>
  3 # include<malloc.h>
  4 # include<stdlib.h>
  5 # define MAX_SIZE 6//队列最大长度 + 1
  6 
  7 
  8 typedef int ElemType;
  9 
 10 typedef struct CircularQueue//队列参数
 11 {
 12     int * pBase;//指向数组首地址的指针
 13     int front;//出队下标指向队列的要出队的第一个元素
 14     int rear;//入队下标,指向队列元入队元素的下一个空间
 15 }CircularQueue, *pCircularQueue;
 16 
 17 //1、初始化循环队列
 18 void InitCircularQueue(pCircularQueue Q);
 19 // 2、返回队列中已有元素个数
 20 int CircularQueueLength(pCircularQueue Q);
 21 // 3、判断循环队列是否为满
 22 bool CircularQueueIsFull(pCircularQueue Q);
 23 // 4、将元素e进行入队
 24 bool CircularQueueEn(pCircularQueue Q, ElemType e);
 25 //5、判断循环队列是否为空
 26 bool CircularQueueIsEmpty(pCircularQueue Q);
 27 // 6、遍历队内所有元素
 28 void CircularQueueTraverse(pCircularQueue Q);
 29 //7、出队,出队元素由e返回
 30 bool CircularQueueOut(pCircularQueue Q, ElemType &e);
 31 //8、清空队列
 32 void CircularQueueClear(pCircularQueue Q);
 33 //9、销毁队列
 34 void CircularQueueDestory(pCircularQueue Q);
 35 
 36 
 37 
 38 int main()
 39 {
 40     CircularQueue Q;
 41     InitCircularQueue(&Q);
 42     if (CircularQueueIsEmpty(&Q))
 43     {
 44         printf("队列为空\n");
 45     }
 46     else
 47     {
 48         printf("队列不为空\n");
 49     }
 50 
 51     for (int i = 0; i < 5; i++)
 52     {
 53         CircularQueueEn(&Q, 2*i);
 54     }
 55     CircularQueueTraverse(&Q);
 56     ElemType e1;
 57     for (int i = 0; i < 4; i++)
 58     {
 59         if (CircularQueueOut(&Q,e1))
 60         {
 61             printf("  %d\n", e1);
 62         }        
 63     }
 64     printf("\n");
 65     CircularQueueTraverse(&Q);
 66 
 67     return 0;
 68 }
 69 
 70 //1、初始化循环队列
 71 void InitCircularQueue(pCircularQueue Q)
 72 {
 73     Q->pBase = (ElemType *)malloc(sizeof(ElemType)*MAX_SIZE);
 74     if (Q->pBase==NULL)
 75     {
 76         printf("内存分配失败,程序退出!\n");
 77         exit(-1);
 78     }
 79     Q->front = Q->rear = 0;
 80 }
 81 
 82 // 2、返回队列中已有元素个数
 83 int CircularQueueLength(pCircularQueue Q)
 84 {
 85     return (Q->rear - Q->front + MAX_SIZE) % MAX_SIZE;
 86 }
 87 
 88 // 3、判断循环队列是否为满
 89 bool CircularQueueIsFull(pCircularQueue Q)
 90 {
 91     if ((Q->rear+1)%MAX_SIZE == Q->front)
 92     {
 93         return true;
 94     }
 95     return false;
 96 }
 97 // 4、将元素e进行入队
 98 bool CircularQueueEn(pCircularQueue Q,ElemType e)
 99 {
100     if (CircularQueueIsFull(Q))
101     {
102         printf("队列已满,入队失败!\n");
103         return false;
104     }
105     Q->pBase[Q->rear] = e;
106     Q->rear = (Q->rear + 1) % MAX_SIZE;
107     return true;
108 }
109 
110 //5、判断循环队列是否为空
111 bool CircularQueueIsEmpty(pCircularQueue Q)
112 {
113     if (Q->front == Q->rear)
114         return true;
115     else
116         return false;
117 }
118 // 6、遍历队内所有元素
119 void CircularQueueTraverse(pCircularQueue Q)
120 {
121     int i = Q->front;
122     while (i!=Q->rear)
123     {
124         printf("  %d", Q->pBase[i]);
125         i = (i+1)%MAX_SIZE;
126     }
127     printf("\n");
128 }
129 
130 //7、出队,出队元素由e返回
131 bool CircularQueueOut(pCircularQueue Q, ElemType &e)
132 {
133     if (CircularQueueIsEmpty(Q))
134     {
135         printf("队列为空,出队失败!\n");
136         return false;
137     }
138         e = Q->pBase[Q->front];
139         Q->front = (Q->front + 1) % MAX_SIZE;
140         return true;
141 }
142 //8、清空队列
143 void CircularQueueClear(pCircularQueue Q)
144 {
145     Q->front = Q->rear = 0;    
146 }
147 //9、销毁队列
148 void CircularQueueDestory(pCircularQueue Q)
149 {
150     if (Q->pBase)//如果队列存在
151     {
152         free(Q->pBase);//释放队列所占内存
153     }
154     Q->pBase = NULL;//不指向任何存储空间
155     Q->front = Q->rear = 0;
156 }

 

 本博客参考数据结构笔记(十)-- 循环队列_队列的循环遍历_淡定的炮仗的博客-CSDN博客

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3