文档详情

第3章栈与队列B--数据结构课件(吴伟民-严蔚敏编著).ppt

发布:2018-07-04约4.45千字共21页下载文档
文本预览下载声明
数据结构课程的内容 上堂课遗留问题讨论 第三章 栈和队列 3.1 栈(Stack) 定 义 教材P59对队列有更详细定义: 链队列示意图 顺序队示意图 问:什么叫“假溢出” ?如何解决? 答:在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。 例2 :数组Q[n]用来表示一个循环队列,f 为当前队列头元素的前一位置,r 为队尾元素的位置。假定队列中元素的个数小于n,计算队列中元素的公式为: (A) r-f (B)(n+f-r)% n (C)n+r-f (D) (n+r-f)% n 问:为什么要设计队列?它有什么独特用途? 离散事件的模拟(模拟事件发生的先后顺序); 操作系统中多道作业的处理(一个CPU执行多个作业); 3. 简化程序设计。 讨论(代本章小结) 线性表、栈与队的异同点 相同点:逻辑结构相同,都是线性的;都可以用顺序存储或链表存储;栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。 不同点: ① 运算规则不同,线性表为随机存取,而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。 ② 用途不同,线性表比较通用;堆栈用于函数调用、递归和简化设计等;队列用于离散事件模拟、多道作业处理和简化设计等。 * 教材P43中case1: DelFirst(hb,qb);InsFirst(ha,qb); 是先删除后插入,有无风险?这两条语句能否颠倒? 2. 教材P53表3.1中,?1和?2哪个对应栈顶元素,哪个对应键盘输入字符? 答:根据P53Precede()函数可知,?1对应栈顶元素。因此: 答:①无风险,因为删除语句中没有free(p)操作,且链表的合并无需删除结点,只需重链指针。 ② 可以颠倒次序,但会繁琐些,因为InsFirst的入口参数qb还得作为输出参数被送出来。 若 栈顶元素 操作符,则退栈、计算,结果压入OPND栈; 栈顶元素= 操作符且不为‘#’,脱括号(弹出左括号); 栈顶元素 操作符,压入OPTR栈。 3.2 队列(Queue) 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 1. 定义 2. 逻辑结构 3. 存储结构 4. 运算规则 5. 实现方式 3.2 队列 与同线性表相同,仍为一对一关系。 顺序队或链队,以循环顺序队更常见。 只能在队首和队尾运算,且访问结点时依照先进先出(FIFO)的原则。 关键是掌握入队和出队操作,具体实现依顺序队或链队的不同而不同。 基本操作有入队或出队,建空队列,判队空或队满等操作。 3. 存储结构 4. 运算规则 5. 实现方式 2. 逻辑结构 只能在表的一端进行插入运算,在表的另一端进行删除运算的线性表 (头删尾插) 队列 (Queue)是仅在表尾进行插入操作,在表头进行删除操作的线性表。 表尾即 an 端,称为 队尾 ; 表头即 a1 端,称为队头。 它是一种先进先出(FIFO)的线性表。 例如:队列 Q= (a1 , a2 , a3 , ……….,an-1 , an ) 插入元素称为入队;删除元素称为出队。 队头 队尾 队列的抽象数据类型定义见教材P59-60 队列的存储结构为链队或顺序队 (常用循环顺序队) 讨论: 空队列的特征? Q (队尾) (队首) front a1 a2 a3 ^ rear p front ^ rear ③ 怎样实现入队和出队操作? 入队(尾部插入):rear-next=S; rear=S; 出队(头部删除):front-next=p-next; 完整动作设计参见教材P61-62 ② 队列会满吗? front=rear 一般不会,因为删除时有free动作。除非内存不足! Q (队尾) (队首) front a1 a2 a3 data a4 0 . . . . . . . 99 rear ② 队列会满吗? 很可能会,因为数组前端空间无法释放。因此数组应当有长度限制。 ① 空队列的特征? 约定:front=rear 队尾后地址 入队(尾部插入):v[rear]=e; rear++; 出队(头部删除):x=v[front]; front++; 讨论: 假溢出 有缺陷 ③ 怎样实现入队和出队操作? 3.2 队列 3.2 队列 解决假溢出的途径———采用循环队列 a3 a2 a1 0 1 2 3 N-1 rear front 循环队列(臆造) 顺序队
显示全部
相似文档