要求循环队列不损失一个空间全部都能得到利用,设置一个标志量 tag,以 tag 为 0 或 1 来区分头尾指针 相同时的队列状态,请编写与此结构相应的人队与出队算法。
时间: 2023-05-15 20:07:04 浏览: 142
好的,以下是循环队列的人队与出队算法:
定义一个循环队列结构体,包含队列大小、头指针、尾指针、标志量 tag,以及一个指向队列数组的指针。
```
typedef struct {
int size;
int head;
int tail;
int tag;
int *queue;
} CircularQueue;
```
初始化循环队列:
```
void initQueue(CircularQueue *q, int size) {
q->size = size;
q->head = 0;
q->tail = 0;
q->tag = 0;
q->queue = (int*)malloc(sizeof(int) * size);
}
```
入队操作:
```
int enqueue(CircularQueue *q, int data) {
if ((q->tail + 1) % q->size == q->head) {
// 队列已满
return 0;
}
q->queue[q->tail] = data;
q->tail = (q->tail + 1) % q->size;
if (q->tail == q->head) {
// 队列满了,需要改变标志量
q->tag = 1;
}
return 1;
}
```
出队操作:
```
int dequeue(CircularQueue *q, int *data) {
if (q->head == q->tail && q->tag == 0) {
// 队列为空
return 0;
}
*data = q->queue[q->head];
q->head = (q->head + 1) % q->size;
if (q->head == q->tail) {
// 队列空了,需要改变标志量
q->tag = 0;
}
return 1;
}
```
以上就是循环队列的人队与出队算法,希望能对你有所帮助。
阅读全文