【数据结构】实现队列的接口(用c语言实现)

 

  • 队列的概念及结构


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

  • 队列的实现

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

声明:该图片并非原创,单纯只是为了大家能更好的理解队列的结构。

  • 队列接口的实现:

  • <Queue.h>

  • #pragma once
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>
    #include <assert.h>
    
    typedef int QUDataType;
    
    typedef struct QueueNode
    {
    	QUDataType _data;
    	struct QueueNode* _next;
    }QueueNode;
    
    typedef struct Queue
    {
    	QueueNode* _front;//队头
    	QueueNode* _rear;//队尾
    }Queue;
    
    void QueueInit(Queue* q);
    void QueueDestroy(Queue* q);
    
    void QueuePush(Queue* q, QUDataType x);//在队头入数据
    void QueuePop(Queue* q);//在队头出数据
    
    int QueueSize(Queue* q);//数据的个数
    int QueueEmpty(Queue* q);//判断是否为NULL
    
    QUDataType QueueFront(Queue* q);//取出队头数据
    QUDataType QueueBack(Queue* q);//取出队尾数据
    
  • <Queue.c>

#include "Queue.h"

void QueueInit(Queue* q)//置空即可
{
	assert(q);
	q->_front = q->_rear = NULL;
}

void QueueDestroy(Queue* q)
{
	assert(q);
	QueueNode* cur = q->_front;
	while (cur)
	{
		QueueNode* next = cur->_next;
		free(cur);
		cur = next;
	}
	q->_front = q->_rear = NULL;
}

QueueNode* BuyQueueNode(QUDataType x)
{
	QueueNode* node = (QueueNode*)malloc(sizeof(QueueNode));//这里注意开辟的是一个结构体,而不是整形
	node->_data = x;
	node->_next = NULL;

	return node;
}

void QueuePush(Queue* q, QUDataType x)//在队头入数据
{
	assert(q);
	if (q->_front == NULL)
	{
		q->_front = q->_rear = BuyQueueNode(x);
	}
	else
	{
		q->_rear->_next = BuyQueueNode(x);
		q->_rear = q->_rear->_next;
	}
}

void QueuePop(Queue* q)//在队头出数据
{
	assert(q);
	if (q->_front)
	{
		QueueNode* next = q->_front->_next;
		free(q->_front);
		q->_front = next;

		if (q->_front == NULL)//当front为NULL时,back还未置空,如果队尾不置空,会出现野指针的问题
		{
			q->_rear = NULL;
		}
	}
}

int QueueSize(Queue* q)//数据的个数
{
	assert(q);
	int size = 0;
	QueueNode* cur = q->_front;
	while (cur)
	{
		cur = cur->_next;
		size++;
	}
	return size;
}

int QueueEmpty(Queue* q)//判断是否为NULL
{
	assert(q);
	if (q->_front == NULL)
	{
		return 0;
	}
	else
	{
		return 1;
	}
	//return q->_front==NULL ? 0:1;
}

QUDataType QueueFront(Queue* q)//取出队头数据
{
	assert(q);
	return q->_front->_data;
}

QUDataType QueueBack(Queue* q)//取出队尾数据
{
	assert(q);
	return q->_rear->_data;
}
  • <test.c>

#include "Queue.h"

void QueueTest()
{
	Queue q;
	QueueInit(&q);
	QueuePush(&q, 1);
	QueuePush(&q, 2);
	QueuePush(&q, 3);
	QueuePush(&q, 4);
	QueuePop(&q);
	while (QueueEmpty(&q))
	{
		printf("front:%d\n", QueueFront(&q));
		QueuePop(&q);
	}
}

int main()
{
	QueueTest();
	system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/83034037