C++数据结构的队列详解

2021-11-16

目录
  • 前言
  • 1. 队列的概念及结构
  • 2. 队列的实现
    • 2.1 queue.h
    • 2.2 queue.c
    • 2.3 test.c
  • 总结

    前言

    hello,大家好,这期文章我们来分享数据结构关于队列的知识。希望对大家有所帮助,闲言少叙,现在开始。

    1. 队列的概念及结构

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

    2. 队列的实现

    2.1 queue.h

    #include<stdio.h>
    #include<stdbool.h>
    #include<assert.h>
    #include<malloc.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 QueueDestory(Queue *pq);
    void QueuePush(Queue *pq,QDataType x);
    void QueuePop(Queue *pq);
    QDataType QueueFront(Queue *pq);
    QDataType QueueBack(Queue *pq);
    bool QueueEmpty(Queue *pq);
    int QueueSize(Queue *pq);
    

    2.2 queue.c

    #include"queue.h"
    void QueueInit(Queue *pq)
    {
    	assert(pq);
    	pq->head = pq->tail = NULL;
    }
    void QueueDestory(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("malloc fail\n");
    		exit(-1);
    	}
    	newnode->data = x;
    	newnode->next = NULL;
    	if (pq->tail == NULL)
    	{
    		pq->head = pq->tail = newnode;
    	}
    	else
    	{
    		pq->tail->next = newnode;
    		pq->tail = newnode;
    	}
    }
    void QueuePop(Queue *pq)
    {
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	if (pq->head->next == NULL)
    	{
    		free(pq->head);
    		pq->head = pq->tail = NULL;
    	}
    	else
    	{
    		QueueNode *next = pq->head->next;
    		free(pq->head);
    		pq->head = next;
    	}
    }
    QDataType QueueFront(Queue *pq)
    {
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	return pq->head->data;
    }
    QDataType QueueBack(Queue *pq)
    {
    	assert(pq);
    	assert(!QueueEmpty(pq));
    	return pq->tail->data;
    }
    bool QueueEmpty(Queue *pq)
    {
    	assert(pq);
    	return pq->head == NULL;
    }
    int QueueSize(Queue *pq)
    {
    	int size = 0;
    	QueueNode *cur = pq->head;
    	while (cur)
    	{
    		QueueNode *next = cur->next;
    		++size;
    		cur = cur->next;
    	}
    	return size;
    }
    

    2.3 test.c

    #include"queue.h"
    void TestOne()
    {
    	Queue q;
    	QueueInit(&q);
    	QueuePush(&q, 1);
    	QueuePush(&q, 2);
    	QueuePush(&q, 3);
    	QueuePush(&q, 4);
    	while (!QueueEmpty(&q))
    	{
    		printf("%d  ", QueueFront(&q));
    		QueuePop(&q);
    	}
    	printf("\n");
    	QueueDestory(&q);
    }
    int main()
    {
    	TestOne();
    	return 0;
    }
    

    总结

    本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注北冥有鱼的更多内容!

    《C++数据结构的队列详解.doc》

    下载本文的Word格式文档,以方便收藏与打印。