队列 - 采用数组实现 - C语言

根据初始化size参数,动态申请元素空间.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define RET_TRUE     0
#define RET_FALSE   -1

typedef struct Queue Queue;

struct Queue {
	char **data;
	int max_q_size;
	int enq_pos;    /* The index of element to be enqueued */
	int deq_pos;    /* The index of element to be dequeued */
	int ele_nums;   /* The count of element in queue */
	int (*enqueue)(Queue *q, char *ele);
	int (*dequeue)(Queue *q, char **ele);
	int (*is_empty)(Queue *q);
	int (*is_full)(Queue *q);
	int (*get_queue_ele_num)(Queue *q);
	void (*destroy)(Queue *q);
};

static int q_is_empty(Queue *q)
{
	if(NULL == q)
		return RET_FALSE;

	if(q->ele_nums == 0)
		return RET_TRUE;

	return RET_FALSE;
}

static int q_is_full(Queue *q)
{
	if(NULL == q)
		return RET_FALSE;

	if(q->ele_nums == q->max_q_size)
		return RET_TRUE;

	return RET_FALSE;
}

static int q_enqueue(Queue *q, char *ele)
{
	int ele_len;

	if(NULL == q || NULL == ele || q->is_full(q) == RET_TRUE)
		return RET_FALSE;

	ele_len = strlen(ele) + 1;
	q->data[q->enq_pos] = malloc(ele_len);
	if(q->data[q->enq_pos] == NULL) {
		printf("enqueue: malloc fail for q->data[%d], size=%d\n", q->enq_pos, ele_len);
		return RET_FALSE;
	}
	
	memset(q->data[q->enq_pos], 0, ele_len);
	strcpy(q->data[q->enq_pos], ele);

	printf("enqueue ok: q->data[%d]=%s\n", q->enq_pos, ele);
	
	q->ele_nums++;
	q->enq_pos++;
	if(q->enq_pos == q->max_q_size)
		q->enq_pos = 0;

	return RET_TRUE;
}

/*
 * q_dequeue will malloc for parameter *ele.
 */
static int q_dequeue(Queue *q, char **ele)
{
	int ele_len;
	char *q_ele;

	if(NULL == q || q->is_empty(q) == RET_TRUE)
		return RET_FALSE;

	q_ele = q->data[q->deq_pos];
	ele_len = strlen(q_ele) + 1;
	
	*ele = malloc(ele_len);
	if(*ele == NULL) {
		printf("dequeue: malloc fail with %d bytes\n", ele_len);
		return RET_FALSE;
	}
	memset(*ele, 0, ele_len);
	strcpy(*ele, q_ele);

	printf("dequeue ok: q->data[%d]=%s\n", q->deq_pos, *ele);

	free(q->data[q->deq_pos]);
	q->data[q->deq_pos] = NULL;

	q->ele_nums--;
	q->deq_pos++;
	if(q->deq_pos == q->max_q_size)
		q->deq_pos = 0;

	return RET_TRUE;
}

static int get_queue_ele_num(Queue *q)
{
	if(NULL == q)
		return 0;

	return q->ele_nums;
}

static void q_destroy(Queue *q)
{
	int i;

	if(NULL == q || NULL == q->data)
		return;

	for(i = 0; i < q->max_q_size; i++) {
		if(q->data[i]) {
			free(q->data[i]);
			q->data[i] = NULL;
		}
	}
	free(q->data);
	q->data = NULL;
}

static int q_init(Queue *q, int size)
{
	if(NULL == q || size <= 0)
		return RET_FALSE;

	q->data = malloc(size*sizeof(char *));
	if(q->data == NULL) {
		printf("q_init: malloc fail for q->data, size=%d\n", size);
		return RET_FALSE;
	}

	q->max_q_size = size;
	q->enq_pos    = 0;   /* The first enqueue element will be store at index 0 */
	q->deq_pos    = 0; 
	q->ele_nums   = 0;
	q->enqueue    = q_enqueue;
	q->dequeue    = q_dequeue;
	q->is_empty   = q_is_empty;
	q->is_full    = q_is_full;
	q->get_queue_ele_num = get_queue_ele_num;
	q->destroy    = q_destroy;

	return RET_TRUE;
}


static void printf_msg(Queue *q)
{
	printf("Queue is empty: %s\n", (q->is_empty(q) == RET_TRUE)?"TRUE":"FALSE");
	printf("Queue is full: %s\n", (q->is_full(q) == RET_TRUE)?"TRUE":"FALSE");
	printf("Element number in Queue: %d\n", q->get_queue_ele_num(q));
}


int main()
{
	Queue q;
	char *ele;
	int i, count;
	q_init(&q, 10);

	printf_msg(&q);
	
	/* Add 5 elements */
	printf("We are going to add 5 elements into queue:\n");
	q.enqueue(&q, "The first element");
	q.enqueue(&q, "2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa");
	q.enqueue(&q, "3:The third element");
	q.enqueue(&q, "4:Bejing Beijing");
	q.enqueue(&q, "5:The fivth element");

	printf_msg(&q);

	/* Remove 2 elements */
	printf("We are going to remove 2 elements from queue:\n");
	q.dequeue(&q, &ele);
	printf("We got:%s\n", ele);
	free(ele);
	q.dequeue(&q, &ele);
	printf("We got:%s\n", ele);
	free(ele);

	printf_msg(&q);

	/* Add 9 elements */
	printf("We are going to add 9 elements, but only 7 will be added successfully\n");
	q.enqueue(&q, "6:66666666");
	q.enqueue(&q, "7:7777777777777777");
	q.enqueue(&q, "8:88888888888888888888");
	q.enqueue(&q, "9:99");
	q.enqueue(&q, "10:10101010110");
	q.enqueue(&q, "11:111111111");
	q.enqueue(&q, "12:121212121212121212");
	q.enqueue(&q, "13:133333333333333");     /* fail to add */
	q.enqueue(&q, "14:4444441444414441444"); /* fail to add */

	printf_msg(&q);

	/* Remove all elements */
	printf("We are going to remove all elements\n");
	count = q.get_queue_ele_num(&q);
	for(i = 0; i < count; i++) {
		q.dequeue(&q, &ele);
		printf("We got:%s\n", ele);
		free(ele);
	}
	
	printf_msg(&q);


	return 0;
}

程序执行结果:

Queue is empty: TRUE
Queue is full: FALSE
Element number in Queue: 0
We are going to add 5 elements into queue:
enqueue ok: q->data[0]=The first element
enqueue ok: q->data[1]=2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
enqueue ok: q->data[2]=3:The third element
enqueue ok: q->data[3]=4:Bejing Beijing
enqueue ok: q->data[4]=5:The fivth element
Queue is empty: FALSE
Queue is full: FALSE
Element number in Queue: 5
We are going to remove 2 elements from queue:
dequeue ok: q->data[0]=The first element
We got:The first element
dequeue ok: q->data[1]=2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
We got:2:aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Queue is empty: FALSE
Queue is full: FALSE
Element number in Queue: 3
We are going to add 9 elements, but only 7 will be added successfully
enqueue ok: q->data[5]=6:66666666
enqueue ok: q->data[6]=7:7777777777777777
enqueue ok: q->data[7]=8:88888888888888888888
enqueue ok: q->data[8]=9:99
enqueue ok: q->data[9]=10:10101010110
enqueue ok: q->data[0]=11:111111111
enqueue ok: q->data[1]=12:121212121212121212
Queue is empty: FALSE
Queue is full: TRUE
Element number in Queue: 10
We are going to remove all elements
dequeue ok: q->data[2]=3:The third element
We got:3:The third element
dequeue ok: q->data[3]=4:Bejing Beijing
We got:4:Bejing Beijing
dequeue ok: q->data[4]=5:The fivth element
We got:5:The fivth element
dequeue ok: q->data[5]=6:66666666
We got:6:66666666
dequeue ok: q->data[6]=7:7777777777777777
We got:7:7777777777777777
dequeue ok: q->data[7]=8:88888888888888888888
We got:8:88888888888888888888
dequeue ok: q->data[8]=9:99
We got:9:99
dequeue ok: q->data[9]=10:10101010110
We got:10:10101010110
dequeue ok: q->data[0]=11:111111111
We got:11:111111111
dequeue ok: q->data[1]=12:121212121212121212
We got:12:121212121212121212
Queue is empty: TRUE
Queue is full: FALSE
Element number in Queue: 0

猜你喜欢

转载自blog.csdn.net/weixin_42263483/article/details/80867979