队列的结构与实现

文章详细介绍了队列这种数据结构的定义,特性以及实现方式,特别是使用链表来优化尾插和头删操作。队列遵循先入先出(FIFO)原则,文中提供了队列初始化、检查是否为空、销毁、插入(Push)、删除(Pop)、获取队首和队尾元素的函数实现。
摘要由CSDN通过智能技术生成

队列的定义

队列是指一种数据结构,结构特点是FIFO(First In First Out),即先入先出。

队列的数据只能尾插头删,因此可以将队列看作排队,一群人排队结账,谁先排队谁先结账。

队列的实现

队列的数据的插入和删除只有尾插和头删,考虑到顺序表头删效率低,选择链表实现队列。虽然链表尾插效率低,但是可以用一个尾指针来提高尾插效率。

队列实现:

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

typedef int QueueDataType;

typedef struct QueueNode {
    QueueDataType data;
    struct QueueNode* next;
}QueueNode;

//头指针和尾指针可以写成变量,但是函数传参时会很麻烦,可以写成一个结构体:
typedef struct Queue {
    QueueNode* first;
    QueueNode* tail;
}Queue;

void QueueInit(Queue* p){
    assert(p);
    p->first = p->tail = NULL;
}

bool QueueEmpty(Queue* p){
    assert(p);
    return p->first == NULL;
}

void QueueDestory(Queue* p){
    assert(p);
    QueueNode* cur = p->first;
    QueueNode* next = NULL;
    while(cur){
        next = cur->next
        free(cur);
        cur = next;
    }
}

void QueuePush(Queue* p, QueueDataType x){
    assert(p);
    QueueNode* new = (QueueNode*)malloc(sizeof(QueueNode));
    if(tem == NULL){
        perror("malloc fail");
        return;
    }
    nem->data = x;
    nem->next = NULL;
    //尾插分两种情况:队列为空或不为空
    if(QueueEmpty){
        p->first = p->tail = new;
    }
    else{
        p->tail->next = new;
        p->tail = new;
    }
}

void QueuePop(Queue* p){
    assert(p);
    //数据删除,队列不能为空
    assert(!QueueEmpty(p));
    //头删分两种情况:
    if(p->first == p->tail){
    //队列中只有一个元素
        free(p->first);
        p->first = p->tail = NULL;
    }
    else{
    //队列中有多个元素
        QueueNode* next = p->first->next;
        free(p->first);
        p->first = next;
    }
}

void QueueFront(Queue* p){
    assert(p);
    assert(!QueueEmpty(p));
    return p->first->data;
}

void QueueTail(Queue* p){
    assert(p);
    assert(!QueueEmpty(p));
    return p->tail->data;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值