数据结构----数组队列

 由数组作为存储方式的队列模型:

上面的取余操作是为了防止越界访问,详细见下面代码:

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;
}

 下一期画一下由链表为存储结构的队列模型。

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值