博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小菜一步一步学数据结构之(六)队列
阅读量:6281 次
发布时间:2019-06-22

本文共 1231 字,大约阅读时间需要 4 分钟。

队列是一种先进先出的线性表,它只允许在表的一段进行插入,而在另外一端删除元素。

这里写图片描述
这里写图片描述
这里写图片描述

队列的顺序表示—用一维数组base[M]

#define M 100//最大队列长度        Typedef struct{        QElemType *base;        int front;        int rear;        }SqQueue;

这里写图片描述

空队标志:front==rear入队:base[rear++]=x;出队:x=base[front++];

但是这样做存在一个问题,如下:

这里写图片描述

front=0 front≠0

rear=M时 rear=M时
再入队—真溢出 再入队—假溢出
该怎样解决呢?
—-循环队列
这里写图片描述

base[0]接在base[M-1]之后          若rear+1==M          则令rear=0;          实现:利用“模”运算          入队:          base[rear]=x;          rear=(rear+1)%M;          出队:          x=base[front];          front=(front+1)%M;

又出现另外一个问题

这里写图片描述

解决方案:

1.另外设一个标志以区别队空、队满
2.少用一个元素空间:
队空:front==rear
队满:(rear+1)%M==front

循环队列

#define MAXQSIZE 100Typedef struct{ QElemType *base;//初始化的动态分配存储空间 int front;//头指针 int rear;//尾指针}SqQueue;

循环队列初始化

Status InitQueue(SqQueue &Q){ Q.base=new QElemType[MAXQSIZE]  if(!Q.base)exit(OVERFLOW);  Q.front=Q.rear=0;  return OK;}

循环队列的长度

int QueueLength(SqQueue Q){ return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}

循环队列入队

Status EnQueue(SqQueue &Q,QElemType e){ if((Q.rear+1)%MAXQSIZE==Q.front) return ERROR; Q.base[Q.rear]=e; Q.rear=(Q.rear+1)%MAXQSIZE; return OK;}

顺环队列出队

Status DeQueue(LinkQueue &Q,QElemType &e){   if(Q.front==Q.rear)   return ERROR;   e=Q.base[Q.front];   Q.front=(Q.front+1)%MAXQSIZE;   return OK;}
你可能感兴趣的文章
Go 时间交并集小工具
查看>>
iOS 多线程总结
查看>>
webpack是如何实现前端模块化的
查看>>
TCP的三次握手四次挥手
查看>>
关于redis的几件小事(六)redis的持久化
查看>>
package.json
查看>>
webpack4+babel7+eslint+editorconfig+react-hot-loader 搭建react开发环境
查看>>
Maven 插件
查看>>
初探Angular6.x---进入用户编辑模块
查看>>
计算机基础知识复习
查看>>
【前端词典】实现 Canvas 下雪背景引发的性能思考
查看>>
大佬是怎么思考设计MySQL优化方案的?
查看>>
<三体> 给岁月以文明, 给时光以生命
查看>>
Android开发 - 掌握ConstraintLayout(九)分组(Group)
查看>>
springboot+logback日志异步数据库
查看>>
Typescript教程之函数
查看>>
Android 高效安全加载图片
查看>>
vue中数组变动不被监测问题
查看>>
3.31
查看>>
类对象定义 二
查看>>