欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【数据结构】队列相关操作

程序员文章站 2022-06-05 14:53:34
...

一、队列的定义

  • 队列是一种特殊的线性表、队列仅在线性表的两端进行操作
  • 队头(Front):取出数据元素的一端
  • 队尾(Rear):插入数据元素的一端
  • 队列不允许在中间部位进行操作

二、队列的特性

  • 由于队列只允许在极端操作,故栈的特性为先进先出(FIFO) 。如下图所示:
    【数据结构】队列相关操作

三、队列的操作

  • 创建队
  • 销毁队
  • 进队
  • 出队
  • 获取队头元素
  • 判空
  • 获取队列的大小

四、队列的实现

  • 队列是一种特殊的线性表
  • 队列只允许在线性表的两端进行操作
  • 队列通常有两种实现方式:顺序结构实现(动态)、链式结构实现

参考代码:

  • 链式结构实现:
Queue.h:
#ifndef __QUEUE_H__
#define __QUEUE_H__

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

/**************************************************************
*                           链式队列                          *
***************************************************************/
typedef int DataType;

typedef struct QueueNode
{
    DataType* data;
    struct QueueNode* pNext;
}QueueNode;

typedef struct Queue
{
    QueueNode* front;
    QueueNode* rear;
}Queue;

//初始化
void QueueInit(Queue* pQueue);
//销毁
void QueueDestory(Queue* pQueue);

QueueNode* BuyNode(DataType x);
//入队
void QueuePush(Queue* pQueue, DataType x);
//出队
void QueuePop(Queue* pQueue);
//取队头元素
DataType QueueTop(Queue* pQueue);
//取队尾元素
DataType QueueBack(Queue* pQueue);
//判空
int QueueEmpty(Queue* pQueue);
//队的大小
int QueueSize(Queue* pQueue);
//测试
void testQueue();



#endif//__QUEUE_H__
Queue.c
#include "Queue.h"

////////////////////////////有头结点的队列/////////////////////////////
/*//初始化
void QueueInit(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pNode = (DataType*)malloc(sizeof(DataType));//头结点
    pNode->pNext = NULL;
    pQueue->front = pQueue->rear = pNode;
}
//销毁
void QueueDestory(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pCur = pQueue->front->pNext;
    while (pCur)
    {
        QueueNode* pDel = pCur;
        pQueue->front->pNext = pDel->pNext;
        free(pDel);
        pDel = NULL;
        pCur = pQueue->front->pNext;
    }
    free(pQueue->front);
    pQueue->front = NULL;

}

QueueNode* BuyNode(DataType x)
{
    QueueNode* ptr = (DataType*)malloc(sizeof(DataType));
    assert(ptr);
    ptr->data = x;
    ptr->pNext = NULL;
    return ptr;
}
//入队
void QueuePush(Queue* pQueue, DataType x)
{
    assert(pQueue);
    QueueNode* back = BuyNode(x);
    pQueue->rear->pNext = back;
    pQueue->rear = back;

}
//出队
void QueuePop(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pDel = pQueue->front->pNext;
    pQueue->front->pNext = pDel->pNext;

    if (pDel == pQueue->rear)
    {
        pQueue->rear = pQueue->front;
    }
    free(pDel);
    pDel = NULL;

}
//取队头元素
DataType QueueTop(Queue* pQueue)
{
    assert(pQueue);
    return pQueue->front->pNext->data;

}
//判空
int QueueEmpty(Queue* pQueue)
{
    assert(pQueue);
    return pQueue->front->pNext == NULL;;

}
//队的大小
int QueueSize(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pCur = pQueue->front->pNext;
    int len = 0;
    while (pCur)
    {
        len++;
        pCur = pCur->pNext;

    }
    return len;

}*/


///////////////////////////////无头结点/////////////////////////////
//初始化
void QueueInit(Queue* pQueue)
{
    assert(pQueue);
    pQueue->front = NULL;
    pQueue->rear = NULL;
}

//销毁
void QueueDestory(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pCur = pQueue->front;
    while (pCur)
    {
        QueueNode* next = pCur->pNext;
        free(pCur);
        pCur = next;
    }
    pQueue->front = pQueue->rear = NULL;
}

QueueNode* BuyNode(DataType x)
{
    QueueNode* ptr = (QueueNode*)malloc(sizeof(QueueNode));
    assert(ptr);
    ptr->data = x;
    ptr->pNext = NULL;
    return ptr;
}

//入队
void QueuePush(Queue* pQueue, DataType x)
{
    assert(pQueue);
    if (pQueue->rear == NULL)
    {
        QueueNode* node = BuyNode(x);
         pQueue->rear = node;
         pQueue->front = pQueue->rear;
    }
    else
    {
        QueueNode* node = BuyNode(x);
        pQueue->rear->pNext = node;
        pQueue->rear = node;
    }
}

//出队
void QueuePop(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pCur = pQueue->front->pNext;
    free(pQueue->front);
    pQueue->front = pCur;

    if (pCur == NULL)
    {
        pQueue->rear = NULL;
    }

}

//取队头元素
DataType QueueFront(Queue* pQueue)
{
    assert(pQueue);
    return pQueue->front->data;
}

//取队尾元素
DataType QueueBack(Queue* pQueue)
{
    assert(pQueue);
    return pQueue->rear->data;

}

//判空
int QueueEmpty(Queue* pQueue)
{
    assert(pQueue);
    return pQueue->front == NULL;
}

//队的大小
int QueueSize(Queue* pQueue)
{
    assert(pQueue);
    QueueNode* pCur = pQueue->front;
    int len = 0;
    while (pCur)
    {
        len++;
        pCur = pCur->pNext;
    }
    return len;
}


//测试
void testQueue()
{
    Queue q;

    QueueInit(&q);
    QueuePush(&q, 5);
    QueuePush(&q, 4);
    QueuePush(&q, 3);
    QueuePush(&q, 2);

    printf("队列的大小:%d\n",QueueSize(&q));
    printf("队首元素:%d\n", QueueFront(&q));


    while (!QueueEmpty(&q))
    {
        printf("%d ", QueueFront(&q));
        QueuePop(&q);
    }

    QueueDestory(&q);
}