算法与数据机构入门经典(基于数组的队列实现与优化)

前面讲了链表实现队列: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;

}

我之所以还有这个疑惑就是因为还不明白->和 . 的区别是针对谁,是针对两者前面的而言的,看是实体还是

欢迎大家转载,在文章前带上博客链接和名字!

猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80900964