首页 > 其他 > 详细

循环队列③:模运算判断队列空/满

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

技术分享图片

 

 

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

 

循环队列③:模运算判断队列空/满

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

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