第七讲 栈和队列(二) 1/.

Slides:



Advertisements
Similar presentations
迷 宫 最短路径 施沈翔.
Advertisements

一、算法的基本概念 二、数据结构 三、栈和队列 四、排序方法 五、二叉树
问题的提出: 例1 把十进制整数转换为二至十六之间的任一进制数输出。
第五讲 队列.
数据结构——树和二叉树 1/96.
第三章 堆疊與佇列的基本應用 3-1 簡介堆疊(Stack) 3-2 迷宮問題研究 3-3 佇列(queue)的介紹
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
其他类型的链表主要内容 静态链表 循环链表 双向链表.
第3章 栈和队列.
第6章 佇列(Queues) 6-1 佇列的基礎 6-2 佇列的表示法 6-3 環狀佇列 6-4 雙佇列.
主要内容: 1.第一部分 概述 2.第二部分 线性表、栈、队列
第三章 栈和队列 Stack and Queue
第二章 线性表 线性表 顺序表 链表 顺序表与链表的比较.
第三章栈和队列 栈 队列 递归.
佇列 (Queue).
資料結構 第5章 佇列.
数据结构.
制作:崔广才
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
本 章 说 明 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队 列 本 章 小 结 返回主目录.
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第三章 栈和队列 栈和队列是两种重要的数据结构。
本 章 说 明 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式存储结构 2.4 循环链表和双向链
第3章 栈和队列 丽水学院工学院.
1、栈及其实现 2、栈的应用 3、队列及其实现 4、优先级队列 5、链式队列 6、队列应用
西安交通大学计教中心 ctec.xjtu.edu.cn
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
第 3 讲 线性表(一).
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
内容回顾 线性表的定义和特点 线性表的顺序存储及查找、插入和删除.
(知识点三) 2.3 线性表的链式表示和实现 本节将介绍线性表的另一存储结构—— 链式存储及其对应的操作。
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第3章 栈和队列 3.1 栈 本章主题:栈和队列的应用 教学目的:掌握栈和队列的应用方法,理解栈的重要作用
数 据 结 构 刘家芬 Sept 2012.
线性表练习.
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第三章 栈和队列.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
顺序表的插入.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
数据结构概论 第3章 栈和队列 董黎刚 浙江工商大学信电学院 2019年2月25日.
第四章 栈和队列 4.1栈 4.2栈的应用 4.3队列 4.3队列应用.
计算机软件技术基础 数据结构与算法(3).
第2章 线性表 本章主要介绍下列内容 线性表的定义和基本操作 线性表的顺序存储结构 线性表的链式存储结构 线性表的应用举例.
第三章 栈和队列 第二部分 队列(Queue) 2019/4/8.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:中国网页设计
顺序表的删除.
队列及其实现.
单链表的基本概念.
第 四 讲 线性表(二).
第 六 讲 栈和队列(一).
本章的基本内容是: ⑴栈和队列的定义及操作特性; 第3章 特殊线性表—栈、队列和串 ⑵栈和队列的两种存储方法和基本运算的实现;
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第3章 栈和队列 3.1 栈 3.2 队列.
Chapter 2 Entity-Relationship Model
第三章 栈和队列.
本节内容 1.二叉排序树的定义 2.二叉排序树的查找操作 3.二叉排序树的插入操作 4.二叉排序树的删除操作 5.二叉排序树的总结
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
Presentation transcript:

第七讲 栈和队列(二) 1/

内容回顾 栈的定义及特点 顺序栈的类型定义 顺序栈进栈操作int Push( SqStack *S, SElemType e) 顺序栈出栈操作 链栈与链表的区别 2/

队列 教学目标 教学内容 掌握队列的定义和特点 掌握队列的存储结构及其基本操作实现 队列的定义 循环队列—队列的顺序表示和实现 链队列—队列的链式表示和实现 3/ 计算机科学与技术系 信息与教育技术中心

1.队列的定义 定义 特点 队列是只允许在表的一端进行插入,在表的另一端进行删除的线性表。 队尾(rear)——允许插入的一端 队头(front)——允许删除的一端 特点 先进先出(FIFO, First In First Out) 4/

1.队列的定义 双端队列 a1 a2 a3…………………….an 入队 出队 front rear 队列Q=(a1,a2,……,an) 端1 端2 入队 出队 5/

练习 设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次通过S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是( )。 B (A)2 (B)3 (C)4 (D)6 2019年6月1日

1.队列的定义 队列的基本操作 构造空队列 入队 出队 取队头元素 判队列是否为空 置空队 队列的抽象数据类型定义 P73 7/

2.循环队列——队列的顺序表示和实现 队列的顺序存储结构 #define MAXQSIZE 100 //最大长度 Typedef struct { QElemType *base; //初始化的动态分配存储空间 int front; //头指针 int rear; //尾指针 }SqQueue; 2019年6月1日

2.循环队列——队列的顺序表示和实现 队头和队尾指针在队列初始化时均置为指向数组空间的下界 —0。 队头指针指向当前队头元素。 队尾指针指向当前队尾元素的下一个位置。 9/

2.循环队列——队列的顺序表示和实现 SqQueue Q; Q.rear 1 2 3 4 5 1 2 3 4 5 J1 J2 J3 1 2 3 4 5 J1 J2 J3 Q.rear 1 2 3 4 5 1 2 3 4 5 J6 J5 Q.rear Q.front J4 Q.front J3 J2 Q.front=0 Q.rear=0 Q.front J1 队空 J1,J2,J3入队 J1,J2,J3出队 J4,J5,J6入队 10/

2.循环队列——队列的顺序表示和实现 存在问题 解决方案 设数组长度为M,则: 循环队列 当Q.front=0, Q.rear=M时,再有元素入队发生溢出——真溢出 当Q.front0,Q.rear=M时,再有元素入队发生溢出——假溢出 解决方案 循环队列 基本思想:把队列设想成环形,让Q.base[0]接在Q .base[M-1]之后,若Q. rear+1==M,则令Q. rear=0; 11/

2.循环队列——队列的顺序表示和实现 实现 利用“模”运算 入队: Q .base[Q. rear]=x; Q. rear=(Q. rear+1)%M; 出队: x=Q .base [Q. front]; Q. front=(Q. front+1)%M; 队满、队空判定条件 M-1 1 Q. front Q. rear …... 12/

队满:(Q. rear+1)%M== Q. front 队空: Q. front== Q. rear 队满: Q. front== Q. rear 1 2 3 4 5 Q. rear Q. front J4 J5 J6 1 2 3 4 5 Q. rear Q. front 初始状态 J4,J5,J6出队 J7,J8,J9入队 J4 J5 J6 1 2 3 4 5 Q. rear Q. front J9 J8 J7 解决方案: 1.另外设一个标志以区别队空、队满 2.少用一个元素空间: 队空: Q. front== Q. rear 队满:(Q. rear+1)%M== Q. front 13/

2.循环队列——队列的顺序表示和实现 初始化空队列 Status InitQueue(SqQueue *Q){ Q->base=(QElemType *)malloc(MAXQSIZE *sizeof(QElemType)); if(!Q->base) exit(OVERFLOW); Q->front = Q->rear = 0; return OK; } 14/

2.循环队列——队列的顺序表示和实现 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;} 15/

2.循环队列——队列的顺序表示和实现 出队算法 Status DeQueue(SqQueue *Q, QElemType *e) { if(Q->front == Q->rear) // 队列空 return ERROR; * e = Q->base[Q->front]; Q->front = (Q->front+1)%MAXQSIZE; return OK; } 16/

2.循环队列——队列的顺序表示和实现 求队列长度算法 int QueueLength(SqQueue Q) { return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; } 17/

3.链队列—队列的链式表示与实现 队列的链式存储结构简称为链队列,它是限制仅在表头删除和表尾插入的单链表。 显然仅有单链表的头指针不便于在表尾做插入操作,为此再增加一个尾指针,指向链表的最后一个结点。 18/

. data next 队头 队尾 Q.front Q.rear 19/

3.链队列—队列的链式表示与实现 队列的链式存储结构 typedef struct QNode{ typedef struct{ QElemType data; struct QNode *next; } QNode ,*QueuePtr; typedef struct{ QueuePtr front; QueuePtr rear; }LinkQueue; 20/

3.链队列—队列的链式表示与实现 链队列是否需要头结点? 如何判断队空? 为了操作的方便,在链队列中也添加一个头结点,并使队头指针指向头结点。 如何判断队空? 队空条件为 Q.front == Q.rear 链队列在进队时无队满问题 21/

3.链队列—队列的链式表示与实现 队列 初始化操作 Status InitQueue(LinkQueue *Q){ if( !(Q->front=Q->rear=(QueuePtr)malloc (sizeof(QNode)))); exit(OVERFLOW); Q.front->next=NULL; return OK; } 空队列 22/

3.链队列—队列的链式表示与实现 入队列操作 元素x入队列 元素y入队列 Status EnQueue(LinkQueue *Q, QElemType e){ QueuePtr p; if( !(p=(QueuePtr)malloc(sizeof(QNode))) ) exit(OVERFLOW); p->data = e; p->next = NULL; Q->rear->next = p; Q->rear = p; return OK; } 元素x入队列 元素y入队列 23/

3.链队列—队列的链式表示与实现 出队列操作 Status DeQueue(LinkQueue *Q, QElemType *e) { QueuePtr p; if( Q->front == Q->rear ) return ERROR; p = Q->front->next; e = p->data; Q->front->next = p->next; if(Q->rear == p) Q->rear = Q->front; free(p); return OK; } 元素x出队列 元素y出队列 24/

3.链队列—队列的链式表示与实现 队列判空操作 Status QueueEmpty(LinkQueue Q) { if(Q.front == Q.rear) return TRUE; else return FALSE; } 空队列 25/

小结 队列的定义及特点 循环队列结构类型定义及基本操作(初始化、入队、出队、求长度) 链式存储结构类型定义及基本操作 26/

作业 设用一个单向循环链表来表示队列(也称链式循环队列),该队列只设一个队尾指针rear,不设队头指针front,要求设计出该队列的初始化、入队列和出队列操作。 实验三:队列的操作及应用 27/