由数组作为存储方式的队列模型:
上面的取余操作是为了防止越界访问,详细见下面代码:
arrayQueue.h
#ifndef ARRAYQUEUE_H_
#define ARRAYQUEUE_H_
typedef struct _arrayqueue {
int size;
int num;
int head;
int tail;
int *array;
}arrayQueue_t;
#define arrQueueIsEmpty(queue) ((queue->num) == 0)
#define arrQueueIsFull(queue) ((queue->num) == (queue->size))
arrayQueue_t *arrQueue_create(int size);
void arrQueue_destory(arrayQueue_t *queue);
int arrQueue_entry(arrayQueue_t *queue, int data);
int arrQueue_pop(arrayQueue_t *queue, int *data);
int arrQueue_dump(arrayQueue_t *queue);
#endif
arrayQueue.c
#include <stdio.h>
#include <stdlib.h>
#include "arrayQueue.h"
arrayQueue_t *arrQueue_create(int size)
{
arrayQueue_t *queue = (arrayQueue_t *)malloc(sizeof(arrayQueue_t));
if(queue == NULL) {
return NULL;
}
queue->array = (int *)malloc(sizeof(int) * size);
if(queue->array == NULL) {
free(queue);
return NULL;
}
queue->size = size;
queue->num = 0;
queue->head = 0;
queue->tail = 0;
return queue;
}
void arrQueue_destory(arrayQueue_t *queue)
{
if(queue == NULL) {
return ;
}
if(queue->array != NULL) {
free(queue->array);
}
free(queue);
}
int arrQueue_entry(arrayQueue_t *queue, int data)
{
if(queue == NULL) {
return -1;
}
if(arrQueueIsFull(queue)) {
printf("entry faild!! queue is FULL!!\n");
return -1;
}
queue->array[queue->tail] = data;
queue->num ++;
queue->tail = (queue->tail + 1) % queue->size;
return 0;
}
int arrQueue_pop(arrayQueue_t *queue, int *data)
{
if(queue == NULL) {
return -1;
}
if(arrQueueIsEmpty(queue)) {
printf("queue is empty \n");
return -1;
}
*data = queue->array[queue->head];
queue->num--;
queue->head = (queue->head + 1) % queue->size;
return 0;
}
int arrQueue_dump(arrayQueue_t *queue)
{
int pos = 0;
if(queue == NULL) {
return -1;
}
if(arrQueueIsEmpty(queue)) {
printf("queue is empty \n");
return -1;
}
printf("size: %d,num: %d, head: %d, tail: %d\n",
queue->size, queue->num, queue->head, queue->tail);
for(int i = 0; i < queue->num; i++) {
pos = (queue->head + i) % queue->size;
printf("array[%d] = %d\n", pos, queue->array[pos]);
}
return 0;
}
int main()
{
int dat = 0;
arrayQueue_t *queue = arrQueue_create(4);
if(queue == NULL) {
printf("queue create faild\n");
return -1;
}
printf("入队:0 1 2 3: \n");
//入队4个值
for(int i = 0; i < 4; i++) {
arrQueue_entry(queue, i);
}
arrQueue_dump(queue);
//再入队一个
printf("满队列再添加一个: \n");
arrQueue_entry(queue, 4);
arrQueue_dump(queue);
//出队一个
printf("出队一个:\n");
arrQueue_pop(queue, &dat);
printf("pop data %d\n", dat);
arrQueue_dump(queue);
arrQueue_destory(queue);
return 0;
}
下一期画一下由链表为存储结构的队列模型。