objective-c实现一个结构体类型的循环队列
时间: 2023-09-03 16:06:52 浏览: 85
以下是一个简单的Objective-C实现循环队列的例子:
```
typedef struct {
int *array;
int front;
int rear;
int maxSize;
} CircularQueue;
CircularQueue* createCircularQueue(int maxSize) {
CircularQueue *queue = malloc(sizeof(CircularQueue));
queue->maxSize = maxSize;
queue->array = malloc(sizeof(int)*maxSize);
queue->front = -1;
queue->rear = -1;
return queue;
}
void enqueue(CircularQueue *queue, int data) {
if ((queue->front == 0 && queue->rear == queue->maxSize-1) || (queue->rear == (queue->front-1)%(queue->maxSize-1))) {
NSLog(@"Queue is full");
return;
}
else if (queue->front == -1) {
queue->front = queue->rear = 0;
queue->array[queue->rear] = data;
}
else if (queue->rear == queue->maxSize-1 && queue->front != 0) {
queue->rear = 0;
queue->array[queue->rear] = data;
}
else {
queue->rear++;
queue->array[queue->rear] = data;
}
}
int dequeue(CircularQueue *queue) {
if (queue->front == -1) {
NSLog(@"Queue is empty");
return -1;
}
int data = queue->array[queue->front];
queue->array[queue->front] = -1;
if (queue->front == queue->rear) {
queue->front = -1;
queue->rear = -1;
}
else if (queue->front == queue->maxSize-1) {
queue->front = 0;
}
else {
queue->front++;
}
return data;
}
int main(int argc, char * argv[]) {
@autoreleasepool {
CircularQueue *queue = createCircularQueue(5);
enqueue(queue, 1);
enqueue(queue, 2);
enqueue(queue, 3);
enqueue(queue, 4);
enqueue(queue, 5);
enqueue(queue, 6); // full, cannot enqueue
NSLog(@"Dequeue: %d", dequeue(queue)); // 1
NSLog(@"Dequeue: %d", dequeue(queue)); // 2
enqueue(queue, 7);
enqueue(queue, 8);
NSLog(@"Dequeue: %d", dequeue(queue)); // 3
NSLog(@"Dequeue: %d", dequeue(queue)); // 4
NSLog(@"Dequeue: %d", dequeue(queue)); // 5
NSLog(@"Dequeue: %d", dequeue(queue)); // 7
NSLog(@"Dequeue: %d", dequeue(queue)); // 8
dequeue(queue); // empty, cannot dequeue
}
return 0;
}
```
在这个例子中,`CircularQueue`是一个结构体类型,包含一个整型数组`array`,一个表示队列头部位置的`front`,一个表示队列尾部位置的`rear`,以及队列的最大容量`maxSize`。`createCircularQueue`函数用于创建一个新的循环队列,`enqueue`函数用于将数据添加到队列中,`dequeue`函数用于从队列中取出数据。
在`enqueue`函数中,先检查队列是否已满。如果是,则输出`Queue is full`并返回。否则,检查队列是否为空。如果是,则将`front`和`rear`都设置为0,并将数据添加到`array`中。否则,检查队列尾部是否已到达数组的末尾。如果是且队列头部位置不是0,则将队列尾部位置设置为0,并将数据添加到`array`中。否则,将队列尾部位置加1,并将数据添加到`array`中。
在`dequeue`函数中,先检查队列是否为空。如果是,则输出`Queue is empty`并返回-1。否则,将队列头部位置的数据保存到`data`中,并将该位置的值设置为-1。然后,检查队列是否只有一个元素。如果是,则将`front`和`rear`都设置为-1。否则,检查队列头部位置是否已到达数组的末尾。如果是,则将`front`设置为0。否则,将`front`加1。最后,返回保存的数据`data`。
在`main`函数中,先使用`createCircularQueue`创建一个容量为5的新循环队列。然后,使用`enqueue`函数向队列中添加5个数据。再次使用`enqueue`函数添加一个数据,此时应该会输出`Queue is full`。接下来,使用`dequeue`函数从队列中取出数据,并输出取出的数据。重复执行两次,应该分别输出2和3。然后,再次使用`enqueue`函数向队列中添加两个数据。最后,使用`dequeue`函数依次取出队列中的数据,并输出每次取出的数据。最后再次使用`dequeue`函数,此时应该会输出`Queue is empty`。
阅读全文