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