C语言实现动态数组队列

本文介绍了如何使用C语言实现动态数组队列,特别提到在队列不空时尾指针的两种不同指向方式及其对访问效率的影响。作者实现动态数组队列的初衷是为了实现二叉树的层序遍历,并指出可以进一步扩展为泛型。讨论了动态数组、静态数组和链式结构在不同场景下的适用性,强调了具体问题具体分析的重要性。最后,作者分享了在Ubuntu下使用gdb调试代码的经验,并提供了相关资源链接。

代码都是自己手把手敲出来的, 难免会有错误,如果我发现了,就会改。

  • 动态数组队列的实现有下面两种情况:
    * ①若队列不空,尾指针指向队列尾元素的下一个位置
    * ②若队列不空,尾指针指向队列尾元素

②比①,访问尾部元素会快点。数据结构是根据具体应用场景,选择不同的实现方式。

我实现这个队列的原因是, 我想要实现二叉树的层序遍历。
这里还可以继续深入实现泛型。代码根据需求改动。
动态数组队列, 队列的大小是在程序运行过程中确定的;或者队列大小在程序运行当中是可变的。可以选择动态数组实现。
如果队列大小是不变的,那就选择静态数组的方式实现。
如果队列的大小很难确定,那可以选择链式结构实实现。
如果追求速度呢… 具体问题具体分析
下面的程序已在Ubuntu 下使用gdb调试验证过了,调试程序自己写的,验证可能不充分,因为后续自己也发现了一些问题。关于gdb调试器的使用网上有很多资料
https://blog.csdn.net/zzymusic/article/details/4815142
如果类型是自定义类型, 把类型定义 包含进来就行了

/********************************************************************************
* Copyright(c) 2019-20xx
* All right resered.
*
* @file  	dynamic_queue.h
* @author 	hongsmallgod
* @version	V1.0.1
* @data		2019-9-10 10:31:28
* @brief	动态数组头文件
********************************************************************************/
#ifndef _DYNAMIC_QUEUE_H
#define _DYNAMIC_QUEUE_H
#define TAIL  0 /* 若队列不空,尾指针指向队列尾元素的下一个位置 */
#define TAIL1 1 /* 若队列不空,尾指针指向队列尾元素 */
#define dynamic_array_queue  TAIL1

typedef int element; /* 队列元素类型 */
typedef struct queue queue;
struct queue {
    int front;
    int rear;
    element *data;
    int size; /* 队列的大小 */
	/* 函数(方法) */
	int (*num)(queue *); /* 元素数量 */
	int (*enqueue)(queue *, element); /* 入队操作 */
	int  (*dequeue)(queue *, element *); /* 出队操作 */
	int (*head)(queue *, element *); /* 获取队列头元素, 不改变队列 */
	int (*tail)(queue *, element *);  /* 获取队列尾元素, 不改变队列 */
    int (*full)(queue *); /* 判断队列是否已满 */
    int (*empty)(queue *); /* 判断队列是否已空 */
};
extern queue *create_queue(int size);
extern void destroy_queue(queue *q);
#endif

/********************************************************************************
* Copyright(c) 2019-20xx
* All right resered.
*
* @file  	dynamic_queue.c
* @author 	hongsmallgod
* @version	V1.0.1
* @data		2019-9-10 10:31:28
* @brief	动态数组源文件
********************************************************************************/
//下面程序的名称随着项目的进行, 一般会不断的进行改进的.
#include <stdlib.h>
#include "dynamic_queue.h"
static int get_queue_elem_num(queue *);
static int head(queue *, element *);
static int tail(queue *, element *);
static int enqueue(queue *, element);
static int dequeue(queue *, element *);
static int full(queue *);
static int empty(queue *);
queue *create_queue(int size)
{
    queue *q= (queue*)malloc(sizeof(queue));
    if (q== NULL)
        return NULL;
    q->size  = size;
#if dynamic_array_queue ==  TAIL1
    q->front = 1;
    q->rear = 0;
#else
    q->front = 0;
    q->rear  = 0;
#endif
    q->num = get_queue_elem_num;
    q->head = head;
    q->tail = tail;
    q->enqueue = enqueue;
    q->dequeue = dequeue;
    q->full = full;
    q->empty = empty;
    q->data = (element *)malloc(sizeof(element)*size);
    if (q->data == NULL) {
        free(q);
        return NULL;
    }
    return q;
}
static int full(queue *q)
{
#if dynamic_array_queue == TAIL
    return (q->rear + 1) % q->size == q->front;
#else
	return (q->rear + 2) % q->size == q->front;
#endif
}
static int empty(queue *q)
{
#if dynamic_array_queue == TAIL
    return q->rear == q->front;
#else
	return (q->rear + 1) % q->size == q->front;
#endif
}
static int enqueue(queue *q, element data)
{
    if (full(q))
        return 0;
#if dynamic_array_queue == TAIL
    q->data[q->rear] = data; 
    q->rear = (q->rear + 1) % q->size;
#else
	q->rear = (q->rear + 1) % q->size;
	q->data[q->rear] = data; 
#endif
    return 1;
}
static int dequeue(queue *q, element *data)
{
    if (empty(q))
        return 0;
	*data = q->data[q->front];
	q->front= (q->front+ 1) % q->size;
	return 1;
}
void destroy_queue(queue *q)
{
    free(q->data);
    q->data = NULL;
    free(q);
}
static int get_queue_elem_num(queue *q)
{
#if dynamic_array_queue == TAIL
    return (q->rear - q->front + q->size) % q->size;
#else
    return (q->rear +1 - q->front + q->size) % q->size;
#endif
}
static int head(queue *q, element *data)
{
	if (empty(q))
		return 0;
	*data = q->data[q->front];
    return 1;
}
static int tail(queue *q, element *data)
{
	if (empty(q))
		return 0;
#if dynamic_array_queue == TAIL
	*data = q->data[(q->rear - 1 + q->size)%q->size];
#else
	*data = q->data[q->rear];
#endif
	return 1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值