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

如何用花生壳做网站asp网站系统

如何用花生壳做网站,asp网站系统,上海网站搭建公司哪家好,安徽网站设计哪家效果好目录 引言 队列的定义 队列的分类 1.单链表实现 2.数组实现 队列的功能 队列的声明 1.链式队列 2.循环队列 队列的功能实现 1.队列初始化 (1)链式队列 (2)循环队列 (3)复杂度分析 2.判断队列是否为空 (1)链式队列 (2)循环队列 (3)复杂度分析 3.判断队列是否…目录 引言 队列的定义 队列的分类 1.单链表实现 2.数组实现 队列的功能 队列的声明 1.链式队列 2.循环队列 队列的功能实现 1.队列初始化 (1)链式队列 (2)循环队列 (3)复杂度分析 2.判断队列是否为空 (1)链式队列 (2)循环队列 (3)复杂度分析 3.判断队列是否已满 (1)链式队列 (2)循环队列 (3)复杂度分析 4.返回队头元素 (1)链式队列 (2)循环队列 (3)复杂度分析 5.返回队尾元素 (1)链式队列 (2)循环队列 (3)复杂度分析 6.返回队列大小 (1)链式队列 (2)循环队列 (3)复杂度分析 7.元素入队列 (1)链式队列 (2)循环队列 (3)复杂度分析 8.元素出队列 (1)链式队列 (2)循环队列 (3)复杂度分析 9.打印队列元素 (1)链式队列 (2)循环队列 (3)复杂度分析 10.销毁队列 (1)链式队列 (2)循环队列 (3)复杂度分析 链式队列和循环队列的对比 完整代码 1.链式队列 2.循环队列 结束语 引言 在 数据结构——栈 中我们学习了栈的相关知识今天我们接着来学习数据结构——队列。 队列的定义 队列Queue是一种先进先出FIFO, First-In-First-Out的线性数据结构。它只允许在队列的一端队尾进行插入enqueue操作而在另一端队头进行删除dequeue操作。这种操作方式确保了队列中元素的顺序性即最先进入队列的元素将最先被移除。 如图所示 队头Front队头是指队列中允许删除操作的一端。也就是说队列中的元素将按照它们被添加到队列中的顺序从队头开始被逐一移除。 队尾Rear队尾是指队列中允许插入操作的一端。新元素将被添加到队尾以保持队列的先进先出FIFO特性。 队列的分类 队列与栈类似同样可以用两种方式实现。分别是单链表和数组。接下来我们来分析一下如何使用两种方法实现队列。 1.单链表实现 我们可以将链表的头节点与尾节点分别作为队列的队首与队尾这样我们就能用两个指针来对其进行操作。 如下图所示 2.数组实现 问题一 在使用数组实现队列时可能会出现“假溢出”的情况。这是因为数组的头部和尾部是固定的当队列的尾部达到数组的末尾时即使数组的头部还有很多空闲空间也无法再向队列中添加新元素。这种情况下队列虽然看起来是满的但实际上还有很多空间没有被利用。 解决方法 我们可以将数组相接变成循环数组。 问题二 变成循环数组又会出现新的问题当队首与队尾下标都指向同一个节点时这个队列是空还是满呢 解决方法 多使用一个空间便于我们区分队空和队满。若队列不为空让队尾下标指向队尾的下一个位置。我们约定以队头指针在队尾指针的下一位置作为队满的标志即Queue-rear1Queue-front。 如下图所示 队满状态 队列的功能 1.队列的初始化。 2.判断队列是否为空。 3.判断队列是否已满。 4.返回队头元素。 5.返回队尾元素 6.返回队列的大小。 7.元素入队列。 8.元素出队列。 9.打印队列的元素。 10.销毁队列。 队列的声明 1.链式队列 typedef int QDataType;typedef struct QueueNode {struct QueueNode* next;QDataType val; }QNode;typedef struct Queue {QNode* front;QNode* rear;int size; }Queue; 2.循环队列 typedef int QDataType;#define MAXSIZE 30 //定义队列的最大值 typedef struct {QDataType* data;int front; //头指针int rear; //尾指针 }Queue; 队列的功能实现 1.队列初始化 给队列中的各个元素给定值以免出现随机值。 (1)链式队列 //初始化 void QueueInit(Queue* q) {assert(q);q-front NULL;q-rear NULL;q-size 0; } (2)循环队列 //初始化 void QueueInit(Queue* q) {// 为队列的数据存储空间分配内存。q-data (QDataType*)malloc(sizeof(QDataType) * MAXSIZE);if (q-data NULL){perror(malloc fail:);return;}// 初始化队首和队尾指针为0表示队列为空q-front q-rear 0; }(3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列花费的是一个固定大小的空间因此空间复杂度为O(1)。循环队列需要开辟整个队列的大小因此空间复杂度为O(N)。 2.判断队列是否为空 (1)链式队列 判断size是否为0即可。 代码如下 //判断队列是否为空 bool QueueEmpty(Queue* q) {assert(q);return q-size 0; } (2)循环队列 判断front是否等于rear即可。 代码如下 //判断队列是否为空 bool QueueEmpty(Queue* q) {assert(q);return q-front q-rear; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 3.判断队列是否已满 (1)链式队列 链式队列不需要判断队列是否已满。 (2)循环队列 循环队列判断是否已满需要进行一些特殊处理。 代码如下 //判断队列是否已满 bool QueueFull(Queue* q) {assert(q);// 取模操作是避免越界return q-front (q-rear 1) % MAXSIZE; } (3)复杂度分析 时间复杂度由于循环队列花费时间是一个常数因此时间复杂度为O(1)。 空间复杂度循环队列花费的是一个固定大小的空间所以空间复杂度为O(1)。 4.返回队头元素 (1)链式队列 //读取队头数据 QDataType QueueFront(Queue* q) {assert(q);assert(q-front);return q-front-val; } (2)循环队列 //读取队头数据 QDataType QueueFront(Queue* q) {assert(q);assert(!QueueEmpty(q));return q-data[q-front]; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 5.返回队尾元素 (1)链式队列 //读取队尾数据 QDataType QueueBack(Queue* q) {assert(q);assert(q-rear);return q-rear-val; } (2)循环队列 //读取队尾数据 QDataType QueueBack(Queue* q) {assert(q);assert(!QueueEmpty(q));// 当rear为0时rear-1会导致负数索引这在数组中是无效的 // 通过加上MAXSIZE并取模MAXSIZE我们可以确保索引始终在有效范围内 // 这里(q-rear - 1 MAXSIZE) % MAXSIZE计算的是队尾元素的索引return q-data[(q-rear - 1 MAXSIZE) % MAXSIZE]; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 6.返回队列大小 (1)链式队列 链式队列求队列大小很简单直接返回size即可。 代码如下 //统计队列数据个数 int QueueSize(Queue* q) {assert(q);return q-size; } (2)循环队列 我们来分析一下 像这个可以使用rear-front求出队列的大小。但是要知道这是个循环队列rear时是可以跑到front之后的如下图所示 解决方法rear减去front之后加个MAXSIZE就好了。 代码如下 //统计队列数据个数 int QueueSize(Queue* q) {assert(q);return (q-rear - q-front MAXSIZE) % MAXSIZE; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 7.元素入队列 (1)链式队列 链式队列元素入队需要判断队列是否为空的情况。 代码如下 //队尾插入 void QueuePush(Queue* q, QDataType x) {assert(q);QNode* newNode (QNode*)malloc(sizeof(QNode));if (newNode NULL){perror(malloc fail);return;}newNode-next NULL;newNode-val x;// 如果队列为空 if (q-rear NULL){// 新节点既是队首也是队尾q-front q-rear newNode;}else{// 将当前队尾节点的next指向新节点q-rear-next newNode;// 更新队尾指针为新节点q-rear newNode;}q-size; } (2)循环队列 取模操作不能少确保不会越界。 //队尾插入 void QueuePush(Queue* q, QDataType x) {assert(q);if (QueueFull){printf(队列已满\n);return;}q-data[q-rear] x;// rear指针向后移动// (q-rear 1) % MAXSIZE这段代码// 确保了rear指针的值始终在0到MAXSIZE-1的范围内循环q-rear (q-rear 1) % MAXSIZE; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 8.元素出队列 (1)链式队列 //队头删除 void QueuePop(Queue* q) {assert(q);assert(q-size ! 0);// 检查队列中是否只有一个节点if (q-front-next NULL){free(q-front);// 队列变为空队首和队尾指针都设置为NULLq-front q-rear NULL;}// 多个节点else{// 保存下一个节点的指针QNode* next q-front-next;// 释放队首节点free(q-front);// 更新队首指针为下一个节点q-front next;}q-size--; } (2)循环队列 //队头删除 void QueuePop(Queue* q) {assert(q);assert(!QueueEmpty(q));// front指针向后移动// (q-front 1) % MAXSIZE这段代码// 确保了front指针的值始终在0到MAXSIZE-1的范围内循环q-front (q-front 1) % MAXSIZE; } (3)复杂度分析 时间复杂度由于链式队列和循环队列花费时间都是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 9.打印队列元素 (1)链式队列 //打印队列元素 void QueuePrint(Queue* q) {assert(q);QNode* cur q-front;QNode* tail q-rear;printf(队头-);while (cur ! tail-next){printf(%d-, cur-val);cur cur-val;}printf(队尾\n); } (2)循环队列 //打印队列元素 void QueuePrint(Queue* q) {assert(q);int cur q-front;printf(队头-);while (cur ! q-rear){printf(%d-, q-data[cur]);// 避免越界cur (cur 1) % MAXSIZE;}printf(队尾\n); } (3)复杂度分析 时间复杂度由于链式队列和循环队列都需要遍历整个队列因此时间复杂度为O(n)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 10.销毁队列 (1)链式队列 //销毁 void QueueDestroy(Queue* q) {assert(q);QNode* cur q-front;while (cur){QNode* next cur-next;free(cur);cur next;}q-front q-rear NULL;q-size 0; } (2)循环队列 //销毁 void QueueDestroy(Queue* q) {assert(q);free(q-data);q-data NULL;q-front q-rear 0; } (3)复杂度分析 时间复杂度由于链式队列需要遍历整个队列因此时间复杂度为O(n)。循环队列花费时间是一个常数因此时间复杂度为O(1)。 空间复杂度由于链式队列和循环队列花费空间都是一个常数因此空间复杂度为O(1)。 链式队列和循环队列的对比 链式列表循环列表数据结构使用链表实现队列中的每个元素都是一个链表节点节点之间通过指针相连使用数组实现但在逻辑上将数组的头尾相连形成一个环形结构。内存管理出队或清空队列时需要释放链表节点的内存无需手动释放内存因为队列元素存储在数组中数组的内存由系统自动管理时间效率由于使用头指针与尾指针因此链式队的出队与入队的时间都相对较小循环队列是基于数组实现的支持下标的随机访问所以时间消耗并不大空间效率空间使用灵活可以根据需要动态地增加或减少内存分配空间使用相对固定需要预先定义最大容量。如果队列的实际大小远小于最大容量则会造成空间浪费 完整代码 1.链式队列 Queue.h #define _CRT_SECURE_NO_WARNINGS 1#includestdio.h #includestdlib.h #includeassert.h #includestdbool.htypedef int QDataType;typedef struct QueueNode {struct QueueNode* next;QDataType val; }QNode;typedef struct Queue {QNode* front;QNode* rear;int size; }Queue;//初始化 void QueueInit(Queue* q); //销毁 void QueueDestroy(Queue* q);//队尾插入 void QueuePush(Queue* q, QDataType x); //队头删除 void QueuePop(Queue* q);//读取队头数据 QDataType QueueFront(Queue* q); //读取队尾数据 QDataType QueueBack(Queue* q);//统计队列数据个数 int QueueSize(Queue* q); //判断队列是否为空 bool QueueEmpty(Queue* q);//打印队列元素 void QueuePrint(Queue* q);Queue.c #define _CRT_SECURE_NO_WARNINGS 1#includeQueue.h//初始化 void QueueInit(Queue* q) {assert(q);q-front NULL;q-rear NULL;q-size 0; }//销毁 void QueueDestroy(Queue* q) {assert(q);QNode* cur q-front;while (cur){QNode* next cur-next;free(cur);cur next;}q-front q-rear NULL;q-size 0; }//队尾插入 void QueuePush(Queue* q, QDataType x) {assert(q);QNode* newNode (QNode*)malloc(sizeof(QNode));if (newNode NULL){perror(malloc fail);return;}newNode-next NULL;newNode-val x;// 如果队列为空 if (q-rear NULL){// 新节点既是队首也是队尾q-front q-rear newNode;}else{// 将当前队尾节点的next指向新节点q-rear-next newNode;// 更新队尾指针为新节点q-rear newNode;}q-size; }//队头删除 void QueuePop(Queue* q) {assert(q);assert(q-size ! 0);// 检查队列中是否只有一个节点if (q-front-next NULL){free(q-front);// 队列变为空队首和队尾指针都设置为NULLq-front q-rear NULL;}// 多个节点else{// 保存下一个节点的指针QNode* next q-front-next;// 释放队首节点free(q-front);// 更新队首指针为下一个节点q-front next;}q-size--; }//读取队头数据 QDataType QueueFront(Queue* q) {assert(q);assert(q-front);return q-front-val; }//读取队尾数据 QDataType QueueBack(Queue* q) {assert(q);assert(q-rear);return q-rear-val; }//统计队列数据个数 int QueueSize(Queue* q) {assert(q);return q-size; }//判断队列是否为空 bool QueueEmpty(Queue* q) {assert(q);return q-size 0; }//打印队列元素 void QueuePrint(Queue* q) {assert(q);QNode* cur q-front;QNode* tail q-rear;printf(队头-);while (cur ! tail-next){printf(%d-, cur-val);cur cur-val;}printf(队尾\n); } 2.循环队列 Queue.h #define _CRT_SECURE_NO_WARNINGS 1 #includestdio.h #includestdlib.h #includestdbool.h #includeassert.htypedef int QDataType;#define MAXSIZE 30 typedef struct {QDataType* data;int front;int rear; }Queue;//初始化 void QueueInit(Queue* q); //销毁 void QueueDestroy(Queue* q);//队尾插入 void QueuePush(Queue* q, QDataType x); //队头删除 void QueuePop(Queue* q);//读取队头数据 QDataType QueueFront(Queue* q); //读取队尾数据 QDataType QueueBack(Queue* q);//统计队列数据个数 int QueueSize(Queue* q); //判断队列是否为空 bool QueueEmpty(Queue* q);//打印队列元素 void QueuePrint(Queue* q);//判断队列是否已满 bool QueueFull(Queue* q);Queue.h #define _CRT_SECURE_NO_WARNINGS 1 #includeQueue.h//初始化 void QueueInit(Queue* q) {// 为队列的数据存储空间分配内存。q-data (QDataType*)malloc(sizeof(QDataType) * MAXSIZE);if (q-data NULL){perror(malloc fail:);return;}// 初始化队首和队尾指针为0表示队列为空q-front q-rear 0; }//销毁 void QueueDestroy(Queue* q) {assert(q);free(q-data);q-data NULL;q-front q-rear 0; }//队尾插入 void QueuePush(Queue* q, QDataType x) {assert(q);if (QueueFull(q)){printf(队列已满\n);return;}q-data[q-rear] x;// rear指针向后移动// (q-rear 1) % MAXSIZE这段代码// 确保了rear指针的值始终在0到MAXSIZE-1的范围内循环q-rear (q-rear 1) % MAXSIZE; }//队头删除 void QueuePop(Queue* q) {assert(q);assert(!QueueEmpty(q));// front指针向后移动// (q-front 1) % MAXSIZE这段代码// 确保了front指针的值始终在0到MAXSIZE-1的范围内循环q-front (q-front 1) % MAXSIZE; }//读取队头数据 QDataType QueueFront(Queue* q) {assert(q);assert(!QueueEmpty(q));return q-data[q-front]; } //读取队尾数据 QDataType QueueBack(Queue* q) {assert(q);assert(!QueueEmpty(q));// 当rear为0时rear-1会导致负数索引这在数组中是无效的 // 通过加上MAXSIZE并取模MAXSIZE我们可以确保索引始终在有效范围内 // 这里(q-rear - 1 MAXSIZE) % MAXSIZE计算的是队尾元素的索引return q-data[(q-rear - 1 MAXSIZE) % MAXSIZE]; }//统计队列数据个数 int QueueSize(Queue* q) {assert(q);return (q-rear - q-front MAXSIZE) % MAXSIZE; }//判断队列是否为空 bool QueueEmpty(Queue* q) {assert(q);return q-front q-rear; }//判断队列是否已满 bool QueueFull(Queue* q) {assert(q);return q-front (q-rear 1) % MAXSIZE; }//打印队列元素 void QueuePrint(Queue* q) {assert(q);int cur q-front;printf(队头-);while (cur ! q-rear){printf(%d-, q-data[cur]);// 避免越界cur (cur 1) % MAXSIZE;}printf(队尾\n); } 结束语 本篇博客大致介绍了数据结构——队列的内容。 感谢每位能点进来阅读的大佬们 十分感谢 求点赞收藏关注
http://www.dnsts.com.cn/news/164514.html

相关文章:

  • 基层建设被哪些网站全文收录常州武进建设局网站
  • win10系统可以做网站搭建关于网站建设的建议
  • 东道 网站建设西安短视频培训
  • 太原的网站建设公司做英文题的网站
  • 网站分享设计wordpress 美食
  • 我做网站价格服装定制软件
  • 重庆玖玺国际做网站网站标题 空格
  • 网站前置审批大前端 wordpress
  • 网站在线问答怎么做平面设计与网页设计培训
  • 东营企业网站建设wordpress 全国地区
  • php+mysql网站开发全程实例 下载网站做网站反向代理违法
  • DW如何做明星的个人网站微信公众号小程序助手
  • 长春建设平台网站的公司网站建设需
  • 济南seo关键词优化方案seo优化团队
  • 网站用品哪里进货好自己做一个app
  • php企业网站源码 漂亮wordpress 谷歌分析
  • 室内设计师联盟网站室内设计模拟app
  • 建设物流网站移动互联网应用程序安全认证证书是什么
  • 商洛网站建设电话商城网站设计
  • 企业网站管理系统手机版教程正方教务管理系统入口
  • 网站后台风格好的ftp网站
  • 桐城网站设计天元建设集团有限公司承包
  • 石家庄学做网站建设培训个人做理财网站
  • 网站建设消费调查问卷杭州广告公司排行榜
  • 如何建设影视网站首页广州建设网站哪家好
  • 做网站无需备案中国防疫政策马上要变化了
  • 做旅游宣传图的网站有哪些网站开发需要什么人才
  • 字画价格网站建设方案网站开发制作心得
  • 做电商要关注哪些网站优化学校网站建设方案
  • 域名怎么选才正确网站seo优化全程记录思维导图