6.队列

1.队列基本概念

  队列是一种特殊的受限制的线性表。

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。

  队列是一种先进先出的(First In First Out)的线性表,简称FIFO。允许插入的一端为队尾,允许删除的一端为队头。队列不允许在中间部位进行操作!

队列是一种数据结构,它有以下几个相关的概念:

队头(Head):队列中第一个元素的位置。
队尾(Tail):队列中最后一个元素的位置。
队列大小(Size):队列中元素的数量。
入队操作(Enqueue):向队列的尾部添加一个元素。
出队操作(Dequeue):从队列的头部删除一个元素。
查看队首元素(Peek):查看队头元素但不删除。
是否为空(IsEmpty):判断队列是否为空。

2.队列的顺序存储

基本概念

队列也是一种特殊的线性表;可以用线性表顺序存储来模拟队列。

3.队列的链式存储

基本概念

队列也是一种特殊的线性表;可以用线性表链式存储来模拟队列的链式存储。

4.队列的操作

4.1队列的初始化操作

使用动态数组初始化队列

#define MAX 1024

typedef void* seqQueue;

seqQueue init_SeqQueeu(seqQueue queue, void* data)
{
	struct dynamicArray* arr = init_DynamicArray(MAX);

	return arr;
}
//动态数组结构体
struct dynamicArray
{
	void ** pAddr; //维护真实在堆区创建的数组的指针
	int m_capacity;  // 数组容量
	int m_size;   //数组大小
};

//初始化数组
struct dynamicArray * init_DynamicArray(int capacity)
{
	if (capacity <= 0)
	{
		return NULL;
	}

	//给数组分配空间

	struct dynamicArray * array = malloc(sizeof(struct dynamicArray));
	if (array == NULL)
	{
		return NULL;
	}

	//给数组初始化
	array->pAddr = malloc(sizeof(void *)* capacity);
	array->m_capacity = capacity;
	array->m_size = 0;

	return array;
}

4.2入队

//入队
void push_SeqQueue(seqQueue queue, void * data)
{
	//本质是尾插
	if (queue == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}
	struct dynamicArray* myQueue = queue;
	if (myQueue->m_capacity == MAX)
	{
		return;
	}
	insert_DynamicArray(myQueue, myQueue->m_size, data);
}
//插入数组
void insert_DynamicArray(struct dynamicArray * array, int pos, void * data)
{
	if (array == NULL)
	{
		return;
	}
	if (data == NULL)
	{
		return;
	}

	//无效位置  尾插
	if (pos < 0 || pos > array->m_size)
	{
		pos = array->m_size;
	}

	//判断是否满了,如果满动态扩展
	if (array->m_size == array->m_capacity)
	{
		//1、计算新空间大小
		int newCapacity = array->m_capacity * 2;

		//2、创建新空间
		void ** newSpace = malloc(sizeof(void *)* newCapacity);

		//3、将原有数据拷贝到新空间下
		memcpy(newSpace, array->pAddr, sizeof(void *)* array->m_capacity);

		//4、释放原有内存空间
		free(array->pAddr);

		//5、更新新空间指向
		array->pAddr = newSpace;

		//6、更新新容量
		array->m_capacity = newCapacity;
	}

	//插入新元素

	//移动元素 进行插入新元素
	for (int i = array->m_size - 1; i >= pos; i--)
	{
		//数据向后移动
		array->pAddr[i + 1] = array->pAddr[i];
	}

	//将新元素 插入到指定位置上
	array->pAddr[pos] = data;
	//更新大小
	array->m_size++;
}

4.3出队

//出队
void pop_SeqQueue(seqQueue queue)
{
	//头删
	if (queue == NULL)
	{
		return;
	}

	struct dynamicArray* myQueue = queue;

	if (myQueue->m_size <= 0)
	{
		return;
	}

	removeByPos_DynamicArray(myQueue, 0);
}
//删除数组  按位置删除
void removeByPos_DynamicArray(struct dynamicArray * array, int pos)
{
	if (NULL == array)
	{
		return;
	}

	if (pos < 0 || pos > array->m_size - 1)
	{
		return;
	}

	//数据前移
	for (int i = pos; i < array->m_size - 1; i++)
	{
		array->pAddr[i] = array->pAddr[i + 1];
	}

	//更新数组大小
	array->m_size--;
}

参考资料来源:

黑马程序员

posted @ 2023-06-25 21:55  CodeMagicianT  阅读(31)  评论(0编辑  收藏  举报