```
// 21Coroutines09ObjC0901
// Created by terry on 2021/9/26.
#import
//定义节点结构
**typedef** **struct** {
**int** \*data;//数据域
**int** front;//队列头
**int** rear;//队列尾
**int** size;//队列大小 -> 用以避免数组越界
**int** flag;//标志队列是否满 -> 1 满 0 不满
//如果不用此标志位的话,数组需要留多一位空位用来 判别 队列是否满
//即:当 头指针 在 尾指针的下一个位置(多的空位)时,队列满。
} MyCircularQueue;//采用数组实现
**bool** myCircularQueueIsEmpty(MyCircularQueue\* obj);
**bool** myCircularQueueIsFull(MyCircularQueue\* obj);
//注意加上函数声明
MyCircularQueue\* myCircularQueueCreate(**int** k) {
**if** (k < 0){//传参检查
**return** **NULL**;
}
MyCircularQueue\* obj = (MyCircularQueue\*)malloc(**sizeof**(MyCircularQueue));
**if** (obj == **NULL**){
**return** **NULL**;
}
obj->data = (**int**\*)malloc( k \* **sizeof**(**int**));
**if** (obj\->data == **NULL**){
**return** **NULL**;
}
//赋各项初值
obj->front = obj->rear = 0;
obj->size = k;
obj->flag = 0;
**return** obj;
}
**bool** myCircularQueueEnQueue(MyCircularQueue\* obj, **int** value) {
**if** (myCircularQueueIsFull(obj)){//判断队列是否满
**return** **false**;
}
obj->data\[obj->rear\] = value;//插入数据
obj->rear = ((obj\->rear+1) size) ? (obj->rear+1):0;
//判断是否到达数组边界,且尾指针+1
**if** (obj->rear == obj->front){//在插入新元素后,两指针指向相同,只有队列满一种情况。
obj->flag = 1;//队列已满
}
**return** **true**;
}
**bool** myCircularQueueDeQueue(MyCircularQueue\* obj) {
**if** (myCircularQueueIsEmpty(obj)){//判断队列是否空
**return** **false**;
}
obj->data\[obj->front\] = 0;//清除队头的数据
obj->front = ((obj\->front+1) size) ? (obj->front+1):0;
//判断是否到达数组边界,且头指针+1
obj->flag = 0;//只要删除了元素,队列就不可能满
**return** **true**;
}
**int** myCircularQueueFront(MyCircularQueue\* obj) {
**if** (myCircularQueueIsEmpty(obj)){
**return** -1;
}
**return** obj->data\[obj->front\];
}
**int** myCircularQueueRear(MyCircularQueue\* obj) {
**if** (myCircularQueueIsEmpty(obj)){
**return** -1;
}
**int** i = (obj->rear == 0) ? (obj->size-1):(obj->rear-1);
//尾指针指向的是末尾数据的下一个位置,此处避免数组越界
**return** obj->data\[i\];
}
**bool** myCircularQueueIsEmpty(MyCircularQueue\* obj) {
**if** (obj->flag == 0 && obj\->front == obj->rear){//队列未满 且 首尾指针指向相同,则表明队列空
**return** **true**;
}
**else**{
**return** **false**;
}
}
**bool** myCircularQueueIsFull(MyCircularQueue\* obj) {
**if** (obj->flag == 1){
**return** **true**;
}
**else**{
**return** **false**;
}
}
**void** myCircularQueueFree(MyCircularQueue\* obj) {
free(obj->data);
obj\->data = **NULL**;
free(obj);
obj = **NULL**;
}
**int** main(**int** argc, **const** **char** \* argv\[\]) {
**@autoreleasepool** {
//
MyCircularQueue \* aa=myCircularQueueCreate(10);
// insert code here...
**for**(**int** ii=0;**true**;++ii) {
printf("%d\];",ii);
**int** ran01=rand()%2;
labeStart110:
ran01=rand()%2;
**if**(1\==ran01) //生产
{
**if**(myCircularQueueIsFull(aa)) **goto** labeStart110;
myCircularQueueEnQueue(aa, ii);
// NSLog(@"%d:",ii);
printf("{ii\[%d",ii);
printf("%d", myCircularQueueFront(aa));
printf("\_%d;\\r\\n", myCircularQueueRear(aa));
}//if110
labe2200:
**if**(0\==ran01) //消费
{
**if**( myCircularQueueIsEmpty(aa)) **goto** labeStart110;
myCircularQueueDeQueue(aa);
}//if110else110
//NSLog(@"%d", ii);
}
NSLog(@"Hello, World!");
}
**return** 0;
}
```