千家信息网

C语言链式队列与循环队列怎么实现

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍了C语言链式队列与循环队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言链式队列与循环队列怎么实现文章都会有所收获,下面我们一起来看看吧。队
千家信息网最后更新 2025年01月22日C语言链式队列与循环队列怎么实现

这篇文章主要介绍了C语言链式队列与循环队列怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言链式队列与循环队列怎么实现文章都会有所收获,下面我们一起来看看吧。

队列的实现

队列是一种先进先出(First in First Out)的线性表,简称FIFO。与栈不同,栈是一种后进先出(先进后出)的线性表。在队列中,允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q=(a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后。这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然在队伍的最后。队列分为顺序队列和循环队列。顺序队列我们可以利用数组或者链表实现。这里,我们选择用链表实现顺序队列。

今天主要介绍链表实现的队列和循环队列

链式队列

队列主要有哪些基本操作

// 初始化队列 void QueueInit(Queue* q);// 队尾入队列 void QueuePush(Queue* q, QDataType data);// 队头出队列 void QueuePop(Queue* q);// 获取队列头部元素 QDataType QueueFront(Queue* q);// 获取队列队尾元素 QDataType QueueBack(Queue* q);// 获取队列中有效元素个数 int QueueSize(Queue* q);// 检测队列是否为空,如果为空返回非零结果,如果非空返回0 bool QueueEmpty(Queue* q);// 销毁队列 void QueueDestroy(Queue* q);

链式队列的定义

typedef int QDataType;// 链式结构:表示队列 typedef struct QListNode{    struct QListNode* _next;    QDataType _data;}QNode;// 队列的结构 typedef struct Queue{    QNode* _front;    QNode* _rear;}Queue;

链式队列的实现

1、初始化队列

void QueueInit(Queue* q){    assert(q);    q->_front = NULL;    q->_rear = NULL;}

2、销毁队列

void QueueDestroy(Queue* q){    assert(q);    QNode* cur = q->_front;    while (cur != NULL)    {        QNode* next = cur->_next;        free(cur);        cur = next;    }    q->_front = q->_rear = NULL;}

3、队列判空

bool QueueEmpty(Queue* q){    assert(q);    //if (q->_front == NULL)    //{    //  return 1;    //}    //else    //{    //  return 0;    //}    return q->_front == NULL;}

4、入队操作

void QueuePush(Queue* q, QDataType data){    assert(q);    QNode* newnode = (QNode*)malloc(sizeof(QNode));    if (newnode == NULL)    {        exit(-1);    }    newnode->_data = data;    newnode->_next = NULL;    if (q->_front == NULL)    {        q->_front = q->_rear = newnode;    }    else    {        q->_rear->_next = newnode;        q->_rear = newnode;    }}

5、出队操作

void QueuePop(Queue* q){    assert(q);    assert(!QueueEmpty(q));    QNode* next = q->_front->_next;    free(q->_front);    q->_front = next;    if (q->_front == NULL)    {        q->_rear = NULL;    }}

6、取队头元素

QDataType QueueFront(Queue* q){    assert(q);    assert(!QueueEmpty(q));    return q->_front->_data;}

7、取队尾操作

QDataType QueueBack(Queue* q){    assert(q);    assert(!QueueEmpty(q));    return q->_rear->_data;}

8、队中有效元素个数

int QueueSize(Queue* q){    assert(q);    int size = 0;    QNode* cur = q->_front;    while (cur)     {        size++;        cur = cur->_next;    }    return size;}

循环队列

循环队列的定义

循环队列就是将队列存储空间的最后一个位置绕到第一个位置,形成逻辑上的环状空间,供队列循环使用。在循环队列结构中,当存储空间的最后一个位置已被使用而再要进入队运算时,只需要存储空间的第一个位置空闲,便可将元素加入到第一个位置,即将存储空间的第一个位置作为队尾。循环队列可以更简单防止伪溢出的发生,但队列大小是固定的。在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize。

循环队列的空间可以重复利用,解决了普通队列的空间浪费问题

循环队列的实现

typedef struct {    int *a;    int front;    int tail;    int k;} MyCircularQueue;//提前声明判空判满bool myCircularQueueIsEmpty(MyCircularQueue* obj);bool myCircularQueueIsFull(MyCircularQueue* obj);//创建循环队列MyCircularQueue* myCircularQueueCreate(int k) {    MyCircularQueue* cq=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));    cq->a=(int*)malloc(sizeof(int)*(k+1));    cq->front=cq->tail=0;    cq->k=k;    return cq;}//循环队列入队bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {    if(myCircularQueueIsFull(obj)){        return false;    }    obj->a[obj->tail]=value;    obj->tail++;    obj->tail%=(obj->k+1);    return true;}//循环队列出队bool myCircularQueueDeQueue(MyCircularQueue* obj) {    if(myCircularQueueIsEmpty(obj)){        return false;    }    obj->front++;    obj->front%=(obj->k+1);    return true;}//循环队列取队头int myCircularQueueFront(MyCircularQueue* obj) {    if(myCircularQueueIsEmpty(obj)){        return -1;    }    return obj->a[obj->front];}//循环队列取队尾int myCircularQueueRear(MyCircularQueue* obj) {    if(myCircularQueueIsEmpty(obj)){        return -1;    }    int i=(obj->tail+obj->k)%(obj->k+1);    return obj->a[i];}//循环队列判空bool myCircularQueueIsEmpty(MyCircularQueue* obj) {    return obj->front==obj->tail;}//循环队列判满bool myCircularQueueIsFull(MyCircularQueue* obj) {    return (obj->tail+1)%(obj->k+1)==obj->front;}//销毁循环队列void myCircularQueueFree(MyCircularQueue* obj) {    free(obj->a);    free(obj);}

关于"C语言链式队列与循环队列怎么实现"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"C语言链式队列与循环队列怎么实现"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

队列 循环 元素 链式 空间 位置 存储 语言 知识 结构 顺序 有效 一端 个数 先进 内容 就是 条件 篇文章 线性 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发高薪是骗局 艾特软件开发有限公司 云南信息化网络安全工程平台资质 梦幻新服务器 tm模式 软件开发 重庆大数据软件开发大概多少钱 原神国际服中国玩家选哪个服务器 什么是数字电视双向网络技术 大学生自学网络安全课程 2018年网络安全试卷8 如何下载星宇网站数据库 江苏专业软件开发教程 网页怎么跟数据库连接 阿里云 app 服务器 海南澄迈软件开发园区 jade如何与数据库对比 北京联通智慧安全网络技术罗静华 pptp的服务器密码 戴尔服务器emc是什么意思 苏宁软件开发干到多大 数据库性别属于什么数据类型 网络安全之态势篇 网络安全从入门到入狱图 乌海十中开展网络安全宣传周活动 洛阳网络安全保卫支队 网络安全宣传作品征集手抄报 服务器真的安全吗 数据库事物中间超时了 会回滚吗 dnf怎么选服务器 内网访问服务器数据库速度慢
0