前面讲了链表实现队列:https://blog.csdn.net/qq_37791134/article/details/80883850
今天咱们讲讲基于数组的队列实现。
1.除了使用链表实现队列,还可以使用数组实现的队列,使用相同思路操作队列,通过两个数组下标指针front与tail,front指向队列头部,tail指向队列尾部,添加节点的位置。
struct Queue {
int data[MAX_QUEUE_NUM];
int front;
int tail;
};
void queue_init(Queue *queue) {
int i;
for (i = 0; i < MAX_QUEUE_NUM; i++) {
queue->data[i] = 0;
}
queue->front = 0;
queue->tail = 0;
}
2,数组空间的使用
如下图队列,当有三个元素弹出后,数组的前三个位置不会再被使用,当队列push次数超过数组大小时,则会发生数组越界,使用数组实现队列时,需要考虑数组填满的情况,对于front指针前面的空间,思考如何优化,提升队列空间效率。
3.队列的优化方法,循环队列
4.循环队列如何实现?
利用求余,使得数组头尾相接,对每个元素操作时,增加一个求余过程,可实现将数组头尾相连操作。
代码:
#include<stdio.h>
#define MAX_QUEUE_NUM 10 //宏定义呀
typedef struct Queue Queue; //strust Queue = Queue
//定义结构体
struct Queue {
int data[MAX_QUEUE_NUM];
int front;//头 下标
int tail;//尾 下标
};
void queue_init(Queue *queue) {
int i;
for (i = 0; i < MAX_QUEUE_NUM; i++) {
queue->data[i] = 0;
}
queue->front = 0; //头下标的值是 0
queue->tail = 0;//尾下标的值是 0
}
void queue_push(Queue *queue, int data) {
queue->data[queue->tail] = data;//赋值给原来的尾标签
queue->tail = (queue->tail + 1) % MAX_QUEUE_NUM; //尾节点要向下移动一个位置
}
void queue_pop(Queue *queue) {
queue->front = (queue->front + 1) % MAX_QUEUE_NUM;//头节点向下移动
}
int queue_is_empty(Queue *queue) {
return queue->front == queue->tail; //front 与 tail 指向同一个地方则认为是一样的
}
int queue_size(Queue *queue) {
return (queue->tail - queue->front + MAX_QUEUE_NUM) % MAX_QUEUE_NUM;//刚刚好两倍呀 比如(2*2)%2 =2
}
int queue_front(Queue *queue) {
return queue->data[queue->front];
}
int queue_is_full(Queue *queue) {
return queue_size(queue) == MAX_QUEUE_NUM;//size = MAX_QUEUE_NUM
}
void queue_print(Queue *queue) {
printf("Queue\n");
int i;
for (i = 0; i < MAX_QUEUE_NUM; i++) {
printf("[%d]", queue->data[i]); //queue->data[i] 这种访问方式!!!
}
printf("\n");
}
int main() {
Queue queue;
queue_init(&queue);
queue_print(&queue);
queue_push(&queue, 4);
queue_push(&queue, 6);
queue_push(&queue, 5);
queue_print(&queue);
printf("Queue front value is %d\n", queue_front(&queue));
printf("Queue size is %d\n", queue_size(&queue));
printf("Queue empty is %d\n", queue_is_empty(&queue));
printf("\n");
queue_pop(&queue);
queue_pop(&queue);
queue_print(&queue);
printf("Queue front value is %d\n", queue_front(&queue));
printf("Queue size is %d\n", queue_size(&queue));
printf("Queue empty is %d\n", queue_is_empty(&queue));
printf("\n");
queue_pop(&queue);
queue_print(&queue);
printf("Queue size is %d\n", queue_size(&queue));
printf("Queue empty is %d\n", queue_is_empty(&queue));
return 0;
}
我之所以还有这个疑惑就是因为还不明白->和 . 的区别是针对谁,是针对两者前面的而言的,看是实体还是
欢迎大家转载,在文章前带上博客链接和名字!