队列功能复写

简介:

@[TOC]

前言

数组队列,链式队列都可以,只是因为效率,链表队列更好

队列结构体定义

//队列队尾入,队头出
//队列这里使用链表形式。
//方便操作

typedef int QDateType;

typedef struct node
{
    QDateType x;
    struct node* next;
}Queuenode;//定义队列结点

typedef struct 
{
    Queuenode* head;
    Queuenode* tail;
}Queue;//队列需要从队头出,队尾入,而链表一般只需要头指针,因此将队头,队尾指针存在结构体中。
       //方便且不需要考虑二级指针问题

队列的初始化

void QueueInit(Queue* q)//初始化
{
    assert(q);
    q->head = NULL;
    q->tail = NULL;
}

创建结点

Queuenode* newnode(QDateType x)//创建结点。因为某些需要开辟结点,因此将这步独立出来
{

    Queuenode* q = (Queuenode*)malloc(sizeof(Queuenode));
    if(q==NULL)
    {
    perror("q");
    exit(-1);
    }
    q->x = x;
    q->next = NULL;
    return q;
}

队列判空

bool  QueueEmpty(Queue* q)//因为返回值问题,在判断队列是否为空,只需要与NULL比较.
{
    assert(q);
    
    return q->head == NULL;
}

入队列

void QueuePush(Queue* q, QDateType x)//入队列
{
    assert(q);
    if (QueueEmpty(q))
    {
        Queuenode* node = newnode(x);
        q->head = node;
        q->tail = node;
    }
    else
    {
        Queuenode* node = newnode(x);
        q->tail->next = node;
        q->tail = node;
    }
    
}

出队列

void QueuePop(Queue* q)//出队列
{
    assert(q);
    assert (!QueueEmpty(q));//空队列。
    Queuenode* next = q->head->next;
    free(q->head);
    q->head = next;
    if (q->head == NULL)
    {
        q->tail = NULL;
    }
}

取队头元素

QDateType  QueueTop(Queue* q)
{

    assert(q);
    assert(!QueueEmpty(q));
    return q->head->x;
}

队列大小

size_t  QueueSize(Queue* q)//获取队列中的元素个数
{
    assert(q);
    size_t cnt = 0;
    Queuenode *cur = q->head;
    while (cur!=NULL)
    {
        ++cnt;
        cur = cur->next;

    }
    return cnt;
}

队列打印

void QueuePrint(Queue* q)//打印
{
    assert(q);
    Queuenode* tur= q->head;
    while (tur!=NULL)
    {
        printf("%d->", tur->x);
        tur = tur->next;
    }
    printf("NULL\n");
}

队列销毁

void QueueDestroy(Queue* q)//销毁
{
    assert(q);
    Queuenode* cur = q->head;
    while (cur!=NULL)
    {
        Queuenode* tmp = cur->next;
        free(cur);
        cur = tmp;
    }
    q->head = NULL;
    q->tail = NULL;
}
相关文章
|
10月前
自定义NSOperation
自定义NSOperation
35 0
|
2月前
|
Java
java函数式接口的三种实现方式
java函数式接口的三种实现方式
37 0
|
3月前
|
存储 安全 Java
JAVA常用队列类
JAVA常用队列类
|
3月前
|
安全
C++11 线程安全的队列模板
C++11 线程安全的队列模板
44 0
|
存储
什么是队列,如何实现?
什么是队列,如何实现?
95 0
什么是队列,如何实现?
队列的定义、基本操作、顺序实现(初始化,入队,出队)
数据结构:队列的定义、基本操作、顺序实现(初始化,入队,出队)附有代码讲解
441 0
|
存储
队列的定义及基本操作实现(链式)
队列的定义及基本操作实现(链式)
105 0
|
C++
队列类(C++)
构造函数:初始化队列:将初始尺寸保存到 size,将队首 front 和队尾 rear 均置为 0,为动态数组分配内存并将起始地址保存到 element。Dequeue 函数:若队列不空,则从队列中取出元素并保存到 value中,函数值为 true;size 为动态数组的尺寸,front 为队首元素的下标,rear 为队尾元素下一位置的下标,element 为动态数组的起始地址。Clear 函数:清空队列,将 front 和 rear 重置为 0,操作成功,函数值为 true。首先定义数据元素类型。
131 0
|
算法 前端开发 编译器
我学会了,通过封装来学习队列
队列是一种先进先出的数据结构(先到先得),First In First Out(FIFO) 先进先出,就像你去银行取钱。
87 0
我学会了,通过封装来学习队列