第4讲计算机基本数据结构及其运算(栈和队列)研究报告.ppt

第4讲计算机基本数据结构及其运算(栈和队列)研究报告.ppt

队列 队列的逻辑结构和基本运算 队列的存储结构 循环队列的运算 队列的概念 队列是一种只允许在表的一端(称为队尾)进行插入,在另一端(称为队头)进行删除的线性表。 删除结点 只能删除队头的结点a1 增加结点 只能在队尾插入结点x 队列的概念 队列是一种只允许在表的一端(称为队尾)进行插入,在另一端(称为队头)进行删除的线性表。 与我们生活中的排队非常相似 ? 先排队的先离开 ? 晚排队的晚离开 ? 不允许插队 ? 不允许中途离队 因此,队列也称先进先出(FIFO) 队列有5种基本运算 来使用和管理队列。 队列的基本操作 置队空SetNull(Q) 1 获取有效结点长度GetLength(Q) 2 取头结点GetHead(Q) 3 入队InsQueue(Q, x) 4 出队DelQueue(Q) 5 队列的存储结构 循环队列 顺序队列 链接队列 常用队列的存储结构 顺序队列的存储结构 一维数组来 存放节点数据 数组下标 0 1 2 n - 1 n msize - 1 顺序队列的存储结构 一维数组来 存放节点数据 数组下标 0 1 2 n - 1 n msize - 1 front rear 必须有活动的 表头和表尾的索引 头尾索引即头尾 结点对应的数组下标 顺序队列的结构描述 队中的结点存于一维数组中 头索引 尾索引 顺序队列与假溢出 假设用一维数组Q[0..5]表示顺序队列。设f指向队头元素,r指向队尾元素后一空单元。 A A B C 0 1 2 3 4 5 0 1 2 3 4 5 0 1 2 3 4 5 ← A进队 f ← B,C,D进队 f r f r (3)B,C进队后: (1)初始化后: (2)A进队后: 空队列 r 空队列f=r 入队运算可描述为: array[rear++]; 顺序队列与假溢出 假设用一维数组Q[0..5]表示顺序队列。设f指向队头元素,r指向队尾元素后一空单元。 D E F 0 1 2 3 4 5 0 1 2 3 4 5 f r ← D,E,F 进队 f r ← G进队,“假溢出 (4)A,B,C 出队之后: (5)D,E,F 依次进队之后: 此时空队列f=r 出队运算可描述为: head++; 顺序队列与假溢出 假设用一维数组Q[0..5]表示顺序队列。设f指向队头元素,r指向队尾元素后一空单元。 D E F 0 1 2 3 4 5 0 1 2 3 4 5 f r ← D,E,F 进队 f r ← G进队,“假溢出 (4)A,B,C 出队之后: (5)D,E,F 依次进队之后: 此时空队列f=r 这种意义的队列 称为循环队列。 将将顺序队列的数组设想为一个首尾相接的圆环, 即接在array[msize - 1]之后的是array[0]。 循环队列 0 1 2 n - 1 n msize - 1 front rear 1 n - 1 n rear front 0 msize - 1 在入队和出队操作时须对 头尾索引进行特殊处理 循环队列的入队出队操作 1 n - 1 n front 0 msize - 1 rear rear rear array[rear++] = x; if (rear==maxsize) rear= 0; array[rear++] = x; rear % = maxsize; 利用模运算, 则可优化为: 循环队列的入队出队操作 1 n - 1 n 0 maxsize - 1 rear head++; head % = msize; front a b c d 循环队列的队空与队满情况分析 front rear e f g h rear front 如何确定队空 还是队满呢? 循环队列的队空与队满情况分析 方法1:用一个计数变量来记载队列中的元素个数。 初始化队列时count=0; 当入队时,计数变量+1( count++ ) 当出队时,计数变量-1 (count--) 当count==MAXSIZE时,队满 当count==0时,队空 方法2:设一个标志位用来区别队列是空还是满。 初始化队列时:Q.front=Q.rear,标志位为false 入队后, 则置标志位为true 出队后,将标志位置为false 当Q.front=Q.rear, 且标志位为true时,队满。

文档评论(0)

1亿VIP精品文档

相关文档