当前位置: 首页 > wzjs >正文

企业网站建设 新闻宣传成都市住房和城乡建设厅官方网站

企业网站建设 新闻宣传,成都市住房和城乡建设厅官方网站,个人网页设计作品简单,医院 网站后台管理文章目录 目录 一、概念与结构 二、队列的实现 队列的定义 1.初始化 2.入队列 3.判断队列是否为空 4.出队列 5.取队头数据 6.取队尾数据 7.队列有效个数 8.销毁队列 三.完整源码 总结 一、概念与结构 概念:只允许在一端进行插入数据操作,在另一端进行删除…

文章目录

目录

一、概念与结构

二、队列的实现

队列的定义

1.初始化

2.入队列

3.判断队列是否为空

4.出队列

5.取队头数据

6.取队尾数据

7.队列有效个数

8.销毁队列

三.完整源码

总结


一、概念与结构

概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头

队列底层结构选型:
从逻辑上,队列是线性的;从物理上,队列的实现是可以用数组或链表来实现。已知队列是队尾入数据,队头出数据,如果使用数组的结构, 出队列在数组头上出数据,效率会比较低,时间复杂度为O(n);如果 使用链表的结构实现更优一些,时间复杂度为O(1) 因此使用链表来使用队列更优。

二、队列的实现

队列的定义

因为队列是链表来实现的,在这里实现队列的定义会所有不同。定义“队列的结构”之前要把“队列的结点结构”给定义出来,把结点一个个单独定义出来;再对“队列的结构”进行定义,对队头(phead)、队尾(ptail)两个指针进行结构定义以及定义队列中有效个数(size)

//底层结构用链表
typedef int QDataType;
//定义队列结点的结构:对每个结点单独定义
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QueueNode;
//定义队列结构:要对队头,队尾两个指针进行结构定义
typedef struct Queue {QueueNode* phead;QueueNode* ptail;int size;
}Queue;

1.初始化

代码解析:

先把头结点phead、尾结点ptail 都置为NULL,再把有效个数size设为0.

//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;int size = 0;
}

2.入队列

代码解析:

因为队列底层是链表,所以在把数据入队列之前;我们先申请新结点,再判断新结点是否为空;为空就是申请失败,不为空就是申请成功;如果是队列为空,队头和队尾就是新结点;队列不为空,就在队尾插入新结点,并更新队尾(新结点变成队尾),有效个数 size 增加。


//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail\n");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else {//pq->ptail newnodepq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}

3.判断队列是否为空

代码解析:

通过bool函数判断队列是否为空,如果为空就返回头结点为NULL。

//队列断定
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}

4.出队列

代码解析:

在实现出队列之前,存在两种情况,当队列只有一个结点和当队列有多个结点。先用断言来判断pq,bool函数来对队列进行判空;当队列只有一个结点时,直接头结点释放,并把头结点和尾结点置为NULL;当队列有多个结点时,先创建指针next对当前结点的下一个结点进行保存,避免出现野指针的情况(避免释放了队头指针而队尾指针变成野指针),在对头结点进行释放,释放后让pq中的头指针重新指向保存的节点;最后对size--.

//出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else {QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}

5.取队头数据

代码解析:

先断言判断pq和队列不为空,再直接返回头结点的数据

//取对头数据
QDataType QueueFornt(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}

6.取队尾数据

代码解析:

先断言判断pq和队列不为空,再直接返回尾结点的数据

//取队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}

7.队列有效个数

代码解析:

有两种方法来实现:

方法一:此方法在结构定义中未定义size,所以创建一个指针pcur 从头结点开始遍历,用while 循环,在pcur 不为NULL的情况,依次遍历队列,走到一个结点就对其记数,用size++,并让pcur往后走;最后返回有效元素个数size.但是方法一有不足之处,方法一的时间复杂度为O(n),而队列底层结构是链表而时间复杂度O(1),所以此方法了解即可。

//队列有效元素个数
int QueueSize(Queue* pq)
{//方法一:int size = 0;QueueNode* pcur = pq->phead;while (pcur){size++;pcur = pcur->next;}return size;
}

方法二:方法一在结构定义中没有定义size,而方法二在结构定义中定义了size。先断言pq和队列不为空,再直接返回有效个数size.

//队列有效元素个数
int QueueSize(Queue* pq)
{//方法二:assert(pq);assert(!QueueEmpty(pq));return pq->size;
}

8.销毁队列

代码解析:

创建两个指针,一个指针pcur 从头遍历,一个指针next 对下一个结点起保存作用,释放pcur 并让pcur走到next的位置,一直循环下去直到pcur为空;最后把头结点和尾结点置为NULL,size=0.

//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pq->phead->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;int size = 0;
}

三.完整源码

Queue.h

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//底层结构用链表
typedef int QDataType;
//定义队列结点的结构:对每个结点单独定义
typedef struct QueueNode
{QDataType data;struct QueueNode* next;
}QueueNode;
//定义队列结构:要对队头,队尾两个指针进行结构定义
typedef struct Queue {QueueNode* phead;QueueNode* ptail;int size;
}Queue;//初始化:把队尾和队头都置为NULL,即队列为空
void QueueInit(Queue* pq);//入队列
void QueuePush(Queue* pq, QDataType x);//队列断定
bool QueueEmpty(Queue* pq);//队列有效元素个数
int QueueSize(Queue* pq);//出队列
void QueuePop(Queue* pq);//取对头数据
QDataType QueueFornt(Queue* pq);//取队尾数据
QDataType QueueBack(Queue* pq);//销毁队列:创建两个指针,一个从头遍历,一个起对下一个结点的保存作用
void QueueDestory(Queue* pq);

Queue.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"Queue.h"//初始化
void QueueInit(Queue* pq)
{assert(pq);pq->phead = pq->ptail = NULL;int size = 0;
}//入队列
void QueuePush(Queue* pq, QDataType x)
{assert(pq);QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));if (newnode == NULL){perror("malloc fail\n");exit(1);}newnode->data = x;newnode->next = NULL;if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}else {//pq->ptail newnodepq->ptail->next = newnode;pq->ptail = pq->ptail->next;}pq->size++;
}//队列断定
bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//队列有效元素个数
int QueueSize(Queue* pq)
{//方法一://int size = 0;//QueueNode* pcur = pq->phead;//while (pcur)//{//	size++;//	pcur = pcur->next;//}//return size;//方法二:assert(pq);assert(!QueueEmpty(pq));return pq->size;
}//出队列
void QueuePop(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else {QueueNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}//取对头数据
QDataType QueueFornt(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->phead->data;
}//取队尾数据
QDataType QueueBack(Queue* pq)
{assert(pq);assert(!QueueEmpty(pq));return pq->ptail->data;
}//销毁队列
void QueueDestory(Queue* pq)
{assert(pq);QueueNode* pcur = pq->phead;while (pcur){QueueNode* next = pq->phead->next;free(pcur);pcur = next;}pq->phead = pq->ptail = NULL;int size = 0;
}

Test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"Queue.h"void test()
{Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);//出队列//while (QueueSize(&q))//{//	printf("%d\n", QueueSize(&q));//	QueuePop(&q);//}printf("phead:%d\n", QueueFornt(&q));printf("ptail:%d\n", QueueBack(&q));QueueDestory(&q);
}int main()
{test();return 0;
}


总结

非常感谢大家阅读完这篇博客。希望这篇文章能够为您带来一些有价值的信息和启示。如果您发现有问题或者有建议,欢迎在评论区留言,我们一起交流学习。


文章转载自:

http://b46OX7ZN.gwtgt.cn
http://sckxJuNa.gwtgt.cn
http://x91NHRHr.gwtgt.cn
http://X9KXHxyr.gwtgt.cn
http://72jJykAb.gwtgt.cn
http://ObPjg9cA.gwtgt.cn
http://4Qih77bx.gwtgt.cn
http://fCxyfEj8.gwtgt.cn
http://bPpGIdXR.gwtgt.cn
http://0fG2Rm3z.gwtgt.cn
http://Mxx3hM2B.gwtgt.cn
http://rBxjTo7y.gwtgt.cn
http://uClJa8Zn.gwtgt.cn
http://i6r68IPi.gwtgt.cn
http://MjSbK2us.gwtgt.cn
http://ee9YRWPl.gwtgt.cn
http://XgjOh3up.gwtgt.cn
http://9ANSVRY0.gwtgt.cn
http://Tp15mu9k.gwtgt.cn
http://6pcbeh6F.gwtgt.cn
http://qaefJLCO.gwtgt.cn
http://R4L30zZw.gwtgt.cn
http://MUml54mv.gwtgt.cn
http://4AiTbNB1.gwtgt.cn
http://PdytbM8W.gwtgt.cn
http://ut80kCo9.gwtgt.cn
http://0imeGRlr.gwtgt.cn
http://48moKhRN.gwtgt.cn
http://Dvw05Trd.gwtgt.cn
http://TGSJlsTS.gwtgt.cn
http://www.dtcms.com/wzjs/671461.html

相关文章:

  • 网站建设是什么科目app开发哪家好公司
  • 东莞网站建设价格价格做网站赚钱还是做app赚钱
  • 电子商务网站建设及维护管理ppt微信 网站
  • phpmysql做网站批量下载wordpress文章
  • 平板电脑做网站吗新能源电动汽车排名前十名
  • 更改wordpress程序站点网址网页功能设计
  • 东莞回收网站设计网络优化的目的及意义
  • 遵义建设厅网站首页网站建设需要内容
  • 音乐类网站开发南京seo网站建设费用
  • 宽屏网站模板学asp.net 做网站 书籍
  • 网站制作一年多少钱用哪个程序做网站收录好
  • 各种类型网站建设行业网站方案
  • 网站建设教程开源代码下载百度一下网页搜索
  • 个人做网站赚钱网站推广有什么方法
  • 网站备案的账号找不到网站服务器人多怎么挤进去
  • wordpress做电影网站工商网站如何做实名
  • 购买域名之后怎么做网站秦皇岛网站排名
  • 禅城区网站建设公司高端建站模版
  • 如何申请免费网站空间做catia数据的网站
  • 做水晶接单在哪个网站接商城网站前台html模板
  • 轴承外贸网站怎么做广西建设网注册中心
  • 简单个人网站源码wordpress 微信图标
  • 网站建设规划书实训报告威海屋顶防水价格威海做防水网站
  • 门户网站开发 价格wordpress 调用单页
  • 绵阳网站建设哪家好长春开发小程序开发
  • 电子商务网站建设与管理 教案网站建设 职责
  • 深圳电梯广告制作公司网站网站改版阿里云怎么做网站301定向
  • 中国工程建筑门户网站官网mvc net跳转到另一网站
  • 哪个网站可以做图片链接Wordpress会员插件推荐
  • 搭建网上商城seo推广哪家好