队列功能复写

简介:

@[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;
}
相关文章
|
3月前
|
存储 程序员 索引
列表都有哪些自定义方法,它们是怎么实现的?
列表都有哪些自定义方法,它们是怎么实现的?
33 9
|
6月前
|
Java
不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor
不自定义异步方法的线程池默认使用SimpleAsyncTaskExecutor
100 1
|
7月前
|
存储 缓存 算法
Queue接口分析
Queue接口分析
68 0
|
8月前
|
存储 安全 Java
调用链跨线程传递 ThreadLocal 对象对比
说起本地线程专属变量,大家首先会想到的是 JDK 默认提供的 ThreadLocal,用来存储在整个链路中都需要访问的数据,并且是线程安全的。由于在落地全链路压测的过程中,一个基本并核心的功能需求是流量标记需要在整个链路中进行传递,那么线程上下文环境成为解决这个问题最合适的技术。
92 2
调用链跨线程传递 ThreadLocal 对象对比
|
8月前
|
安全
C++11 线程安全的队列模板
C++11 线程安全的队列模板
85 0
异步时父子线程间的ThreadLocal传递方案
异步时父子线程间的ThreadLocal传递方案
315 0
|
存储
什么是队列,如何实现?
什么是队列,如何实现?
118 0
什么是队列,如何实现?
|
算法 C语言 容器
通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器
通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器
111 0
|
存储
队列的定义及基本操作实现(链式)
队列的定义及基本操作实现(链式)
174 0
|
Java
Java多态的本质—动态分派
Java多态的本质—动态分派
125 0
Java多态的本质—动态分派

热门文章

最新文章