数据结构---实现队列的操作

队列

1.队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

在这里插入图片描述

2.队列的实现

队列也可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低

在这里插入图片描述
Queue.h

typedef int QDataType;
typedef struct QueueNode
{
    
    
	struct QueueNode* _next;
	QDataType _data;
}QueueNode;

typedef struct Queue
{
    
    
	QueueNode* _head;
	QueueNode* _tail;

}Queue;

//初始化
void QueueInit(Queue* pq);
//销毁
void QueueDestroy(Queue* pq);
//
void QueuePush(Queue* pq, QDataType x);
//
void QueuePop(Queue* pq);

QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);

//返回1是空,返回0是非空
int QueueEmpty(Queue* pq);

//返回1是空,返回0是非空
int QueueSize(Queue* pq);

Queue.c

//初始化
void QueueInit(Queue* pq)
{
    
    
	assert(pq);
	pq->_head = pq->_tail = NULL;
}
//销毁
void QueueDestroy(Queue* pq)
{
    
    
	assert(pq);
	QueueNode* cur = pq->_head;
	while (cur)
	{
    
    
		QueueNode* next = cur->_next;
		free(cur);
		cur = next;
	}

	pq->_head = pq->_tail = NULL;
}
//
void QueuePush(Queue* pq, QDataType x)
{
    
    
	assert(pq);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
    
    
		printf("内存不足\n");
		exit(-1);
	}
	newnode->_data = x;
	newnode->_next = NULL;

	if (pq->_head == NULL)
	{
    
    
		pq->_head = pq->_tail = newnode;
	}
	else
	{
    
    
		pq->_tail->_next = newnode;
		pq->_tail = newnode;
	}
}
//出队
void QueuePop(Queue* pq)
{
    
    
	assert(pq);
	assert(pq->_head);//判断头是否为空
	QueueNode* next = pq->_head->_next;
	free(pq);
	pq->_head =next;
}
//取队头数据
QDataType QueueFront(Queue* pq)
{
    
    
	assert(pq);
	assert(pq->_head);

	return pq->_head->_data;
}
//取队尾数据
QDataType QueueBack(Queue* pq)
{
    
    
	assert(pq);
	assert(pq->_tail);

	return pq->_tail->_data;
}

//返回1是空,返回0是非空
int QueueEmpty(Queue* pq)
{
    
    
	assert(pq);
	return pq->_head = NULL ? 1 : 0;
}
int QueueSize(Queue* pq)
{
    
    
	assert(pq);
	QueueNode* cur = pq->_head;
	int size = 0;
	while (cur)
	{
    
    
		++size;
		cur = cur->_next;
	}
	return size;
}

3.循环队列

实际中我们有时还会使用一种队列叫循环队列
环形队列可以使用数组实现,也可以使用循环链表实现
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45657288/article/details/112364403