```
// 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;
}
```