循环队列

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

msize - 1
顺序队列的存储结构
当队列装满时
产生该现象的原因是: 产生该现象的原因是: 被删除的结点(出队结点) 被删除的结点(出队结点) 的空间永远不能再使用。 的空间永远不能再使用。
a[msize]
head
a1 a2 a3
an
Biblioteka Baidu0 1 2
尾索引tail等于 最大结点msize时,
采用循环队列
置队空
获取有效结点长度
取头结点




获取有效结点长度
unsigned char DelQueue(lpQueue * lp) { unsigned char temp; if (lp -> count > 0) { temp = lp -> array[lp -> head ++ ++]; lp -> head % = msize; lp -> count-- --; -- return temp; } else { return FALSE; } }
a[msize]
#define msize typedef struct { unsigned char arrau[msize]; 队中的结点存于一维数组中 unsigned char head; unsgined char tail; }Queue; 头索引 tail 尾索引 128 队中可能最大结点数 head
1 2 3 4 5
置队空SetNull(Q)
队列中的结点保持不变
获取有效结点长度GetLength(Q) 取头结点GetHead(Q) 入队InsQueue(Q, x) 出队DelQueue(Q)
队列的5种基本运算 x
将结点x插入到队列Q的队尾
1 2 3 4 5
置队空SetNull(Q) 获取有效结点长度GetLength(Q) 取头结点GetHead(Q) 入队InsQueue(Q, x) 出队DelQueue(Q)
顺序队列
循环队列
链接队列
本章重点讲解
顺序队列的存储结构
一维数组来 存放节点数据
a[msize]
当队列采用顺序存储结构时, 当队列采用顺序存储结构时, 可利用一维数组来存放结点数据。 可利用一维数组来存放结点数据。
a1 a2 a3
an
数组下标 0 1 2
n-1 n
msize - 1
顺序队列的存储结构
unsigned char arrau[msize]; unsigned char head; unsgined char tail; }Queue;
tail = head + count
}Queue;
空队时,count等于0 空队时,count等于0 等于 有效结点数


队列的逻辑结构和基本计算
a
如何确定队空 还是队满呢? 还是队满呢
e
f
g
h
循环队列的类型定义
count = msize
c d e f h g a
count = 0 head tail
b
head tail
循环队列的类型定义
count = msize
c d e f h
128
count = 0 head tail
b
head tail
有效结点数
循环队列的类型定义
count = msize
c d e f h
128
count = 0 head tail
b
head tail
a g
#define msize typedef struct {
#define msize 增加结构 描述count 描述count typedef struct {
a[msize]
head 1
a1 a2 a2 a 3
an
0 1 2
这种意义的队列 称为循环队列。 称为循环队列。
head
0
a1
an
n
msize - 1 tail
n-1 n-1 n tail msize - 1
在入队和出队操作时须对 头尾索引进行特殊处理
循环队列的入队出队操作
a[msize]
1
a2
head tail tail msize - 1 0
a1
an
n n-1 tail
array[tail++] = x; if (tail ==msize) tail = 0; 利用模运算, 利用模运算, 则可优化为: 则可优化为:
入队后尾索引加1 入队后尾索引加 若尾索引上溢 则置尾索引为上界
array[tail++] = x; tail % = msize;
3.2 循环队列


队列的逻辑结构和基本计算
队列的存储结构
循环队列的运算
队列的概念
队列是一种只允许在表的一端(称为队尾) 队列是一种只允许在表的一端(称为队尾)进行插 入,在另一端(称为对头)进行删除的线性表。 在另一端(称为对头)进行删除的线性表。
队列的概念
队列是一种只允许在表的一端(称为队尾) 队列是一种只允许在表的一端(称为队尾)进行插 入,在另一端(称为对头)进行删除的线性表。 在另一端(称为对头)进行删除的线性表。
count初始值为 初始值为0 初始值为
128
入队时,count加一 入队时,count加一 出队时,count减一 出队时,count减一 unsigned char arrau[msize];
unsigned char 等于msize 满队时,counthead; 满队时,count等于msize 等于 unsgined char count;
数组下标 0 1 2
n-1 n
msize - 1
顺序队列的存储结构
当要插入一结点时
a[msize]
入队运算可描述为: 入队运算可描述为:
array[tail++];
head
a1 a2 a3
an x
0 1 2
必须将结点值插入到 尾索引tail所指向的结点
n-1 n tail
再将头索引加1, 使其指向下一结点
置队空
获取有效结点长度
取头结点


出队时,将头结点的值输出, 出队时,将头结点的值输出, 同时将头索引指向下一结点, 同时将头索引指向下一结点 且将有效结点数减1 且将有效结点数减


当队满时,若再做入队 tail 操作会产生“上溢”
n-1 n
后果 不可预测 msize - 1
循环队列
将将顺序队列的数组设想为一个首尾相接的圆环, 将将顺序队列的数组设想为一个首尾相接的圆环, 即接在array[ array[msize 1]之后的是array[0]。 之后的是array[0] 即接在array[msize - 1]之后的是array[0]。
a g
去掉尾索引
去掉尾索引
#define msize typedef struct { unsigned char arrau[msize]; unsigned char head; unsgined char tail; }Queue; #define msize 增加结构 描述count 描述count typedef struct { unsigned char arrau[msize]; unsigned char head; unsgined char count; }Queue; 128
入队后尾索引加1 入队后尾索引加 尾索引求模
循环队列的入队出队操作
a[msize]
1
a2
head tail msize - 1 n 0
a1
an
n-1
head++; head % = msize;
入队后尾索引加1 入队后尾索引加 尾索引求模
循环队列的队空与队满情况分析
c b
head tail
d
head tail
队列的5种基本运算
删除队列头结点
1 2 3 4 5
置队空SetNull(Q) 获取有效结点长度GetLength(Q) 取头结点GetHead(Q) 入队InsQueue(Q, x) 出队DelQueue(Q)


队列的逻辑结构和基本计算
队列的存储结构
循环队列的运算
队列的存储结构
常用队列的存储结构
获取有效结点长度
取头结点




获取有效结点长度
BOOL InsQueue(lpQueue * lp, unsigned char x) { if (lp -> count < msize) { lp -> array[(lp -> head + lp -> count) % msize] = x; lp -> count++; return TRUE; } else { return FALSE; } }
a1 a2 a3
an
数组下标 0 1 2
n-1 n
msize - 1
顺序队列的存储结构
当要删除一结点时
必须删除索引 head所指向的结点
一维数组来 存放节点数据
a[msize]
head 出队运算可描述为: 出队运算可描述为:
head++;
再将头索引加1, 使其指向下一结点
tail
a1 a2 a3
an
因此,队列也称先进先出(FIFO) 因此,队列也称先进先出(FIFO)
队列有5种基本运算 来使用和管理队列。
队列的5种基本运算
将队列Q置成空队列 1 2 3 4 5 置队空SetNull(Q) 获取有效结点长度GetLength(Q) 取头结点GetHead(Q) 入队InsQueue(Q, x) 出队DelQueue(Q)
队列的5种基本运算
N个结点数
返回队列中的结点数 1 2 3 4 5 置队空SetNull(Q) 获取有效结点长度GetLength(Q) 若N为零,则为空队列 为零, 取头结点GetHead(Q) 入队InsQueue(Q, x) 出队DelQueue(Q)
队列的5种基本运算
读取队列Q中头结点的值
队列的存储结构
循环队列的运算
循环队列的运算
置队空
获取有效结点长度
取头结点




置队空
置队空
void SetNull(lpQueue * lp) { lp -> head = 0; 获取有效结点长度 lp -> count = 0; 习惯上也可顺便 }
取头结点
将头索引置为0 将头索引置为


只要将队列的有效结点 数置为0即可置队空 数置为 即可置队空
删除结点
增加结点
只能删除队头的结点a1
只能在队尾插入结点x
队列的概念
队列是一种只允许在表的一端(称为队尾) 队列是一种只允许在表的一端(称为队尾)进行插 入,在另一端(称为对头)进行删除的线性表。 在另一端(称为对头)进行删除的线性表。
先排队的先离开
与我们生活中的排队非常相似
晚排队的晚离开 不允许插队 不允许中途离队


获取有效结点长度
置队空
unsigned char GetLength(lpQueue * lp) { return (lp -> count); }
获取有效结点长度
取头结点




获取有效结点长度
置队空
unsigned char GetHead(lpQueue * lp) { return (lp -> array[lp -> ->head]); }
必须有活动的 表头和表尾的索引
一维数组来 存放节点数据
a[msize]
队列的操作只能在表头和表尾 进行,且不移动队列的结点。 进行,且不移动队列的结点。
head
a1 a2 a3
an
数组下标 0 1 2
头尾索引即头尾 结点对应的数组下标
n-1 n
tail
msize - 1
顺序队列的结构描述
一维数组来 存放节点数据
相关文档
最新文档