代码都是自己手把手敲出来的, 难免会有错误,如果我发现了,就会改。
- 动态数组队列的实现有下面两种情况:
* ①若队列不空,尾指针指向队列尾元素的下一个位置
* ②若队列不空,尾指针指向队列尾元素②比①,访问尾部元素会快点。数据结构是根据具体应用场景,选择不同的实现方式。
我实现这个队列的原因是, 我想要实现二叉树的层序遍历。
这里还可以继续深入实现泛型。代码根据需求改动。
动态数组队列, 队列的大小是在程序运行过程中确定的;或者队列大小在程序运行当中是可变的。可以选择动态数组实现。
如果队列大小是不变的,那就选择静态数组的方式实现。
如果队列的大小很难确定,那可以选择链式结构实实现。
如果追求速度呢… 具体问题具体分析
下面的程序已在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;
}
本文介绍了如何使用C语言实现动态数组队列,特别提到在队列不空时尾指针的两种不同指向方式及其对访问效率的影响。作者实现动态数组队列的初衷是为了实现二叉树的层序遍历,并指出可以进一步扩展为泛型。讨论了动态数组、静态数组和链式结构在不同场景下的适用性,强调了具体问题具体分析的重要性。最后,作者分享了在Ubuntu下使用gdb调试代码的经验,并提供了相关资源链接。
642

被折叠的 条评论
为什么被折叠?



