数据结构之队列,实现队列的增删改查

目录

一、队列的定义

二、队列的实现

1.使用链表来实现队列

2.实现队列的接口

初始化队列 void QueueInit(Queue *pq)

队尾入队列 void QueuePush(Queue *pq,QDataType data)

队头出队列 void QueuePop(Queue *pq)

获取队列头部元素 QDataType QueueFront(Queue *pq)

获取队列尾部元素 QDataType QueueBack(Queue *pq)

获取队列中的有效元素个数 int QueueSize(Queue *pq)

检测队列是否为空,bool QueueEmpty(Queue *q)

销毁队列 void QueueDestroy(Queue *q)

总结



 


提示:以下是本篇文章正文内容,下面案例可供参考

一、队列的定义

队列:只允许在一端进行插入,另外一端进行删除数据的特殊线性表,队列具有先进先出

入队列:在进行插入操作的一端称为队尾

出队列:在进行删除操作的一端称为队头

数据结构之队列,实现队列的增删改查_第1张图片

二、队列的实现

队列可以使用数组和链表实现,使用数组的结构时,出队列在数据头上出数据,效率低

1.使用链表来实现队列

typedef int QDataType;
//链式结构,表示队列
typedef struct QueueNode
{
    struct QueueNode * next;
    QDataType data;
}QNode;


//队列的结构
typedef struct Queue
{
    QNode * head;
    QNode * tail;
    int size;
}Queue;

2.实现队列的接口

初始化队列 void QueueInit(Queue *pq)

void QueueInit(Queue *pq)
{
    assert(pq);
    pq->head=NULL;
    pq->tail=NULL;
    pq->size = 0;
}

队尾入队列 void QueuePush(Queue *pq,QDataType data)

void QueuePush(Queue *pq,QDataType x)
{
    assert(pq);
    //插入节点,自己构造一个新节点
    QNode * newnode =(QNode *)malloc(sizeof(QNode));
    if(newnode ==NULL)
    {
        perror("error");
        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;
    }
    pq->size++;
}

队头出队列 void QueuePop(Queue *pq)

void QueuePop(Queue *pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    //特殊情况,要考虑只有一个节点,释放之后,head指向空,tail为野指针
    if(pq->head->next ==NULL)
    {
        free(pq->head);
        pq->head = pq->tail = NULL;
    }
    //保存当前节点,head指向下一个,释放当前节点
   else
   {   
     QNode * del = pq->head;
     pq->head = pq->head->next;
     free(del);
   }
    pq->size--;
}

获取队列头部元素 QDataType QueueFront(Queue *pq)

QDataType QueueFront(Queue *pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->head->data;
}

获取队列尾部元素 QDataType QueueBack(Queue *pq)

QDataType QueueBack(Queue *pq)
{
    assert(pq);
    assert(!QueueEmpty(pq));
    return pq->tail->data;
}

获取队列中的有效元素个数 int QueueSize(Queue *pq)

如果使用遍历,size++的方式,时间复杂度为O(n);如果使用全局变量size来计算个数,会在有多个队列的时候容易混乱。所以在定义队列的时候,增加一个size变量,插入的时候size++,删除的时候size--,计算个数的时候可以直接返回size的大小,此时时间复杂度为O(1)

int QueueSize(Queue* pq)
{
	assert(pq);
	return pq->size;
}

检测队列是否为空,bool QueueEmpty(Queue *q)

如果为空返回非0结果,如果不为空返回0 

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->head == NULL && pq->tail == NULL;
}

销毁队列 void QueueDestroy(Queue *q)

 void QueueDestroy(Queue *q)
{
    QNode * cur = pq->head;
    while(cur !=NULL)
    {
        QNode * cur = pq->head;
        while(cur!=NULL)
        {
            QNode * del = cur;
            cur = cur->next;
            free(del);
        }
    //删除完了之后,head和tail为野指针,所以需要置空
    pq->head = pq->tail = NULL;
}

总结

本文主要记录了用链表实现队列,以及对队列的增删改查,技术有限,如有错误请指正。

你可能感兴趣的:(数据结构,数据结构,算法,leetcode,c++)