首页 > 其他 > 详细

循环队列①

时间:2020-10-09 23:20:36      阅读:44      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

 

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 typedef char DataType;
  5 
  6 #define QueueSize 40
  7 
  8 /*
  9 
 10 该种循环队列实现的原理是通过flag标志的值实现一个闭环
 11 
 12 重点:
 13 
 14 为空:Q.front == Q.rear && Q.flag == 0
 15 
 16 已满:Q.front == Q.rear && Q.flag == 1
 17 
 18 每次删除操作成功时,flag = 0
 19 
 20 每次插入操作成功时,flag = 1;
 21 
 22 
 23 
 24 */
 25 
 26 //构造循环队列
 27 typedef struct 
 28 {
 29     DataType  data[QueueSize];
 30     int front, rear, flag;//用标志位记录上一步的操作是什么
 31 }ScQueue;
 32 
 33 //初始化循环队列
 34 void InitScQueue(ScQueue &Q)
 35 {
 36     Q.front = Q.rear = 0;
 37     Q.flag = 0;
 38 }
 39 
 40 //判断循环队列是否为空---同时要判断flag是否为0
 41 bool ScQueueEmpty(ScQueue Q)
 42 {
 43     if (Q.front == Q.rear && Q.flag == 0)
 44     {
 45         return true;
 46     }
 47     else
 48     {
 49         return false;
 50     }
 51 }
 52 
 53 //入队操作--插入队列
 54 bool EnterScqueue(ScQueue &Q, DataType x)
 55 {
 56     //判断队列是否已满
 57     if (Q.front == Q.rear && Q.flag == 1)
 58     {
 59         return false;
 60     }
 61     else
 62     {
 63         Q.data[Q.rear] = x;
 64         Q.rear += 1;
 65         //插入队列了要把标志位设置为1
 66         Q.flag = 1;
 67         return true;
 68     }
 69 }
 70 
 71 //出队操作--删除队列元素
 72 bool DeleteScqueue(ScQueue &Q, DataType &x)
 73 {
 74     //判断队列是否为空
 75     if (Q.front == Q.rear && Q.flag == 0) 
 76     {
 77         return false;
 78     }
 79     else
 80     {
 81         x = Q.data[Q.front];
 82         Q.front += 1;
 83         Q.flag = 0;
 84         return true;
 85     }
 86 }
 87 
 88 //读取队头元素
 89 bool GetScqueueHead(ScQueue Q, DataType &x)
 90 {
 91     //判断队列是否为空
 92     if (Q.front == Q.rear && Q.flag == 0)
 93     {
 94         return false;
 95     }
 96     else
 97     {
 98         x = Q.data[Q.front];
 99         return true;
100     }
101 }
102 
103 //清空队列---只要将三者全部置为0即可清空队列
104 void ClearScqueue(ScQueue &Q)
105 {
106     Q.front = 0;
107     Q.rear = 0;
108     Q.flag = 0;
109 }
110 
111 
112 int main()
113 {
114     char str[] = "ABCDEFGH";
115     char x;
116     
117     ScQueue Q;
118     InitScQueue(Q);
119 
120 
121     for (int i = 0; i < sizeof(str) - 1; i++)
122     {
123         //将字符串中的数据插入队列
124         EnterScqueue(Q, str[i]);
125     }
126 
127     DeleteScqueue(Q, x);
128     printf("出队列的元素为:%c\n", x);
129 
130     printf("顺序队列中的元素为:");
131     //判断是否队列不为空
132     if (ScQueueEmpty(Q) == false)
133     {
134         //这里循环时要注意用队列的头和尾进行循环
135         for (int i = Q.front; i < Q.rear; i++)
136         {
137             printf("%c", Q.data[i]);
138         }
139     }
140 
141 
142     
143 
144     getchar();
145     return 0;
146 }

 

循环队列①

原文:https://www.cnblogs.com/imxiaodi/p/13789253.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!