数据结构 --- 循环队列(队列的顺序存储结构)

Posted luguoshuai

tags:

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

工程目录结构图:

技术分享图片

common.h:

 1 //#ifndef __common_h__
 2 //#define __common_h__
 3 
 4 #define OK 1
 5 #define ERROR 0
 6 #define TRUE 1
 7 #define FALSE 0 
 8 
 9 #define MAXSIZE 20
10 
11 typedef int Status;        //函数的返回结果,OK、ERREO、TRUE、FALSE
12 typedef int ElemType;   //结点数据域的数据类型
13 
14 //#endif

common.h:

1 #include "common.h"
2 
3 Status visit(ElemType e)
4 {
5     printf("%d , ", e);
6     return OK;
7 }

Queue.h:

1 //循环队列的结构
2 typedef struct
3 {
4     ElemType data[MAXSIZE];
5     int front;                //头指针
6     int rear;                //尾指针,队列不为空,指向队列尾元素的下一位
7 }SqQueue;

Queue.c:

 1 #include <stdio.h>
 2 #include "common.h"
 3 #include "Queue.h"
 4 
 5 Status InitQueue(SqQueue *Q)
 6 {
 7     Q->front = 0;
 8     Q->rear = 0;
 9     return OK;
10 }
11 
12 Status ClearQueue(SqQueue *Q)
13 {
14     Q->front = Q->rear = 0;
15     return OK;
16 }
17 
18 Status QueueEmpty(SqQueue Q)
19 {
20     if (Q.front == Q.rear)
21         return OK;
22     else
23         return FALSE;
24 }
25 
26 int GetQueueLength(SqQueue Q)
27 {
28     return (Q.rear - Q.front + MAXSIZE) % MAXSIZE;
29 }
30 
31 Status EnQueue(SqQueue *Q, ElemType e)
32 {
33     //队列已满
34     if ((Q->rear + 1) % MAXSIZE == Q->front)
35         return FALSE;
36 
37     Q->data[Q->rear] = e;
38     Q->rear = (Q->rear + 1) % MAXSIZE; //队尾向后以一个元素,队满后则转移到队列头部
39     return OK;
40 }
41 
42 Status DeQueue(SqQueue *Q, ElemType *e)
43 {
44     if (Q->front == Q->rear)   //队列为空
45         return FALSE;
46 
47     *e = Q->data[Q->front];
48     Q->front = (Q->front + 1) % MAXSIZE;
49 
50     return OK;
51 }
52 
53 Status GetQueueHead(SqQueue *Q, ElemType *e)
54 {
55     if (Q->front == Q->rear) //队列为空
56         return FALSE;
57     *e = Q->data[Q->front];
58     return OK;
59 }
60 
61 Status QueueTraverse(SqQueue Q)
62 {
63     int index = Q.front;
64     while ((index + Q.front) != Q.rear)  //遍历完成
65     {
66         visit(Q.data[index]);
67         index = (index + 1) % MAXSIZE;
68     }
69 
70     return OK;
71 }
72 
73 void StartQueue()
74 {
75     SqQueue Q;
76     if (OK == InitQueue(&Q))
77         printf("
循环队列初始化成功!
");
78 
79     for (int i = 1; i <= 10; ++i)
80         EnQueue(&Q, i * 2);
81 
82     printf("

插入数据1-10后的队列长度为: %d
", GetQueueLength(Q));
83 
84     printf("

队列中的元素是:
");
85     QueueTraverse(Q);
86 
87     int e;
88     DeQueue(&Q, &e);
89     printf("

队首出列: %d
", e);
90     printf("

队首出列后的队列长度为: %d
", GetQueueLength(Q));
91 
92     GetQueueHead(&Q, &e);
93     printf("

队首元素为: %d
", e);
94 
95     ClearQueue(&Q);
96     printf("

清空后的队列长度: %d
", GetQueueLength(Q));
97 }

main.c:

1 int main()
2 {
3     //LinkListStart();
4     //StackStart();
5     //LinkStackStart();
6     StartQueue();
7     getchar();
8     return 0;
9 }

 

以上是关于数据结构 --- 循环队列(队列的顺序存储结构)的主要内容,如果未能解决你的问题,请参考以下文章

队列的定义循环队列的顺序存储结构及链式存储结构

数据结构 --- 循环队列(队列的顺序存储结构)

求一个完整的C程序验证顺序存储结构--循环队列的基本操作

数据结构(C语言版)严蔚敏->队列的顺序存储(循环队列)和链式存储

[数据结构-严蔚敏版]P64循环队列-队列的顺序存储结构

如何只用队头指针实现顺序循环队列?