深圳做网站得外包公司有哪些网站做微信支付
- 作者: 五速梦信息网
- 时间: 2026年04月20日 09:19
当前位置: 首页 > news >正文
深圳做网站得外包公司有哪些,网站做微信支付,wordpress权限ip,网站建设费与无形资产目录 1. 前言1.1 普通循环队列假溢出1.1.1 初始化队列1.1.2 插满队列1.1.3 删除元素后#xff0c;再插入元素 1.2 循环队列1.2.1 插入元素#xff0c;队列已满1.2.2 将元素J1、J2出列#xff0c;循环队列又空出两个空间1.2.3 元素J6可以继续入列 2. 存储结构和函数说明2.1 队… 目录 1. 前言1.1 普通循环队列假溢出1.1.1 初始化队列1.1.2 插满队列1.1.3 删除元素后再插入元素 1.2 循环队列1.2.1 插入元素队列已满1.2.2 将元素J1、J2出列循环队列又空出两个空间1.2.3 元素J6可以继续入列 2. 存储结构和函数说明2.1 队列的结构2.2 基本操作函数2.3 初始化队列2.4 销毁队列 DestroyQueue2.5 清空队列 ClearQueue2.6 获取队列第一个元素 GetHead2.7 获取队列长度2.8 元素入列 EnQueue2.9 元素出列 DeQueue2.10 遍历队列 QueueTraverse 3. 完整源码和测试代码4. 测试结果5. 小结5.1 优点5.2 缺点 1. 前言 将队列的头尾相接臆造成环状的顺序存储结构称为循环队列。 普通的顺序存储队列会出现 假溢出 情况。如下面三张图三个步骤描述的情况
1.1 普通循环队列假溢出
下面来看看普通队列是如何产生假溢出现象的。
1.1.1 初始化队列
此时队列为空队列。头指针和尾指针都指向第一个空间
1.1.2 插满队列
插入J1、J2、J3、J4、J5、J6因为q-rear6说明队列已满
1.1.3 删除元素后再插入元素
删除J1J2按道理应该是空出两个空间可以插入新元素但此时q -rear指向6号地址还是判定队列已满如果再插入元素q-rear7,则队列溢出。但实际队列是有空间的 1.2 循环队列 普通的循环队列有上述假溢出缺点。于是乎循环队列就应运而生了。
循环队列的解决假溢出方法 如下面三张图中展示的步骤
1.2.1 插入元素队列已满
还剩一个空间的时候队列就满了。这样设置的原因是如果不浪费一个空间的话当 queue.frontqueue.rear可能会有两种情况一个是队列为空一个是队列已满。如果预留一个空间的话可以用 queue.rear 1queue.front 判断队列已满这样和队列为空的判断方式不冲突。
1.2.2 将元素J1、J2出列循环队列又空出两个空间 1.2.3 元素J6可以继续入列 2. 存储结构和函数说明
2.1 队列的结构
typedef struct{QElemType * base; //存储空间 int front; //队列头的下标int rear; //队列尾的下标
}SqQueue; //定义一个队列类型 2.2 基本操作函数
和上一篇博客中的链式队列差不多一共8个函数。
Status InitQueue(SqQueue * queue); //初始化队列
void DestroyQueue(SqQueue *queue); //销毁队列
Status ClearQueue(SqQueue * queue);//清空队列
Status QueueEmpty(SqQueue queue); //判断队列是否为空
Status GetHead(SqQueue queue ,QElemType * e); //获取队列头元素
int QueueLength(SqQueue queue); //获取队列长度
Status EnQueue(SqQueue * queue, QElemType e); //元素入列
Status DeQueue(SqQueue * queue ,QElemType * e); //元素出列2.3 初始化队列
原型Status InitQueue(SqQueue * queue) 说明初始化队列,申请一个头结点的内存
/初始化队列,申请一个头结点的内存/
Status InitQueue(SqQueue * queue)
{queue-base (QElemType *) malloc(sizeof(QElemType)*MAXSIZE); //申请一个队列结点作为头结点的内存地址给 队头指针if(queue-base NULL)return FALSE;queue-front queue-rear 0;return TRUE;
}
2.4 销毁队列 DestroyQueue
原型 void DestroyQueue(SqQueue *queue) 功能 销毁队列释放队列的数据空间
/销毁栈释放队列的数据空间/
void DestroyQueue(SqQueue *queue)
{free(queue-base);queue-front queue-rear 0;
}2.5 清空队列 ClearQueue
原型Status ClearQueue(SqQueue * queue) 功能 清空队列的元素但队列的空间保留
//将队列queue清空
Status ClearQueue(SqQueue * queue)
{queue-front queue-rear 0;return OK;
}2.6 获取队列第一个元素 GetHead
原型Status GetHead(SqQueue queue ,QElemType * e) 功能 获取队列第一个元素,注意 不是删除元素
//获取队列第一个元素
Status GetHead(SqQueue queue ,QElemType * e)
{if(QueueEmpty(queue))return FALSE;*equeue.base[queue.front];return TRUE;
}2.7 获取队列长度
原型int QueueLength(SqQueue queue) 功能 队列长度
//返回队列长度
int QueueLength(SqQueue queue)
{return (queue.rear - queue.front MAXSIZE) % MAXSIZE;
}2.8 元素入列 EnQueue
原型Status EnQueue(SqQueue * queue, QElemType e) 功能 元素e 插入队列queue
//元素e 插入队列queue
Status EnQueue(SqQueue * queue, QElemType e)
{if((queue-rear 1) % MAXSIZE queue-front) //队列满return FALSE ;queue-base[queue-rear]e; //e 插入队列尾部队尾加1queue-rear (queue-rear 1) % MAXSIZE;return TRUE;
}2.9 元素出列 DeQueue
原型Status DeQueue(SqQueue * queue ,QElemType * e) 功能 若队列queue不空则删除Q的队头元素用e返回其值并返回 OK否则返回ERROR
//若队列queue不空则删除Q的队头元素用e返回其值并返回 OK否则返回ERROR
Status DeQueue(SqQueue * queue ,QElemType * e)
{if(QueueEmpty( *queue))return FALSE;*e queue-base[queue-front];queue-front (queue-front 1) % MAXSIZE;return TRUE;
}2.10 遍历队列 QueueTraverse
原型Status QueueTraverse(SqQueue queue,void (*visit)()) 功能 遍历队列对队列的每个元素调用Visit函数
//遍历队列对队列的每个元素调用Visit函数
Status QueueTraverse(SqQueue queue,void (*visit)())
{int i queue.front;if(QueueEmpty(queue))return FALSE ;if(queue.front queue.rear) while(i queue.rear)visit(queue.base[i]);else{while(i MAXSIZE)visit(queue.base[i]);i0;while(iqueue.rear)visit(queue.base[i]);}return TRUE;
}3. 完整源码和测试代码
#include stdio.h
#include stdlib.h#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define MAXSIZE 6 //最大值设置为6typedef int Status;typedef int QElemType; //定义元素类型为整型typedef struct{QElemType * base; //存储空间 int front; //队列头的下标int rear; //队列尾的下标
}SqQueue; //定义一个队列类型 Status InitQueue(SqQueue * queue);
void DestroyQueue(SqQueue *queue);
Status ClearQueue(SqQueue * queue);
Status QueueEmpty(SqQueue queue);
Status GetHead(SqQueue queue ,QElemType * e);
int QueueLength(SqQueue queue);
Status EnQueue(SqQueue * queue, QElemType e);
Status DeQueue(SqQueue * queue ,QElemType * e);/初始化队列,申请一个头结点的内存/
Status InitQueue(SqQueue * queue)
{queue-base (QElemType *) malloc(sizeof(QElemType)*MAXSIZE); //申请一个队列结点作为头结点的内存地址给 队头指针if(queue-base NULL)return FALSE;queue-front queue-rear 0;return TRUE;
}/销毁队列释放队列的数据空间/
void DestroyQueue(SqQueue *queue)
{free(queue-base);queue-front queue-rear 0;
}//将队列queue清空
Status ClearQueue(SqQueue * queue)
{queue-front queue-rear 0;return OK;
}//判断队列是否为空
Status QueueEmpty(SqQueue queue)
{return queue.front queue.rear? TRUE:FALSE;
}//获取队列第一个元素
Status GetHead(SqQueue queue ,QElemType * e)
{if(QueueEmpty(queue))return FALSE;*equeue.base[queue.front];return TRUE;
}//返回队列长度
int QueueLength(SqQueue queue)
{return (queue.rear - queue.front MAXSIZE) % MAXSIZE;
}//元素e 插入队列queue
Status EnQueue(SqQueue * queue, QElemType e)
{if((queue-rear 1) % MAXSIZE queue-front) //队列满return FALSE ;queue-base[queue-rear]e; //e 插入队列尾部队尾加1queue-rear (queue-rear 1) % MAXSIZE;return TRUE;
}//若队列queue不空则删除Q的队头元素用e返回其值并返回 OK否则返回ERROR
Status DeQueue(SqQueue * queue ,QElemType * e)
{if(QueueEmpty( *queue))return FALSE;*e queue-base[queue-front];queue-front (queue-front 1) % MAXSIZE;return TRUE;}
void Visit(QElemType e)
{printf(%3d,e);
}
//遍历队列对队列的每个元素调用Visit函数
Status QueueTraverse(SqQueue queue,void (*visit)())
{int i queue.front;if(QueueEmpty(queue))return FALSE ;if(queue.front queue.rear) while(i queue.rear)visit(queue.base[i]);else{while(i MAXSIZE)visit(queue.base[i]);i0;while(iqueue.rear)visit(queue.base[i]);}return TRUE;
}int main()
{QElemType e;SqQueue queue;InitQueue(queue);printf(队头分别插入数字3、4、5、6、7后:);//此时队列已经满了设置maxsize6,实际只能存储5个//因为只剩一个空间代表队列已满。即 front (rear1)%maxsize//如果不留一个空间空着那么队列满和队列空都是 frontrear,很难分辨EnQueue(queue,3);EnQueue(queue,4);EnQueue(queue,5);EnQueue(queue,6);EnQueue(queue,7);QueueTraverse(queue,Visit);printf(\n继续插入数字8);if(EnQueue(queue,8))printf(\n出问题了队列满了还能插入!);elseprintf(\n队列已满无法插入!);printf(\n删除队头数字后:);DeQueue(queue,e); //删除后的队列中还剩4个元素QueueTraverse(queue,Visit);printf(\n继续插入8数字后);EnQueue(queue,8); //数字8被存放到queue.base[5]中了QueueTraverse(queue,Visit);printf(\n清空队列);ClearQueue(queue);printf(\n队列长度:%d\n,QueueLength(queue));DestroyQueue(queue);getchar();return 0;
}4. 测试结果 5. 小结
循环队列的优缺点
5.1 优点
(a) 解决了普通的顺序存储队列的假溢出问题。 (b) 读取方便、快捷
5.2 缺点
存储空间大小固定无法根据需要进行扩展。
- 上一篇: 深圳做网站比较好网站的建立与运营
- 下一篇: 深圳做网站的地方用 htmi5做网站
相关文章
-
深圳做网站比较好网站的建立与运营
深圳做网站比较好网站的建立与运营
- 技术栈
- 2026年04月20日
-
深圳做网站 龙华信科外贸行业网络推广
深圳做网站 龙华信科外贸行业网络推广
- 技术栈
- 2026年04月20日
-
深圳做网站 龙华信科吉林集安市建设局网站
深圳做网站 龙华信科吉林集安市建设局网站
- 技术栈
- 2026年04月20日
-
深圳做网站的地方用 htmi5做网站
深圳做网站的地方用 htmi5做网站
- 技术栈
- 2026年04月20日
-
深圳做网站的公司那个好东莞智通人才网招聘信息网
深圳做网站的公司那个好东莞智通人才网招聘信息网
- 技术栈
- 2026年04月20日
-
深圳做网站多钱wordpress付费观看
深圳做网站多钱wordpress付费观看
- 技术栈
- 2026年04月20日
