第四章 栈和队列 4.1栈 4.2栈的应用 4.3队列 4.3队列应用.

Slides:



Advertisements
Similar presentations
问题的提出: 例1 把十进制整数转换为二至十六之间的任一进制数输出。
Advertisements

实用数据结构基础 第3章 栈.
数据结构——树和二叉树 1/96.
第二章 线性表 1 线性表的逻辑结构及其基本操作 2 线性表的顺序存储结构 3 线性表的链式存储结构 4 静态链表 5 应用实例.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
第3章 栈和队列 3.1 栈 3.2 队列 3.3 应用.
第3章 栈和队列.
主要内容: 1.第一部分 概述 2.第二部分 线性表、栈、队列
第三章栈和队列 栈 队列 递归.
佇列 (Queue).
佇列與推疊 (Queue and Stack)
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
4.4 佇列 特徵: c b a c b d c b 新增 d 刪除 入口 入口 入口 尾端(rear) 尾端(rear) 尾端(rear)
数据结构.
Chap 3 堆疊與佇列 Stack and Queue.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
Ch.3 栈和队列 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
线性表小结 元素之间的线性关系 顺序表 顺序表:元素相邻存储 单链表:后继指针链接 一维数组 给定下标随机存取
本 章 说 明 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队 列 本 章 小 结 返回主目录.
cn/~dongeliu/dsa.html 刘 东 信息学院6系 中国科学技术大学
第3章 栈和队列(二) 1/.
第三章 栈和队列 栈和队列是两种重要的数据结构。
第3章 栈和队列 丽水学院工学院.
1、栈及其实现 2、栈的应用 3、队列及其实现 4、优先级队列 5、链式队列 6、队列应用
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第3章 堆栈和队列 堆栈 堆栈应用 队列 队列应用 优先级队列 主要知识点.
Chapter 6 队列(QUEUES).
第三章 栈与队列 £3.1 栈 £3.3 队列 £3.2 栈的应用举例 £3.1.1 栈的定义 £3.1.2 栈的顺序存储结构
第三章 栈和队列 3.1 栈 3.2 栈的应用举例 3.3 栈与递归的实现 3.4 队列.
第3章 栈和队列(一).
第三章 栈和队列.
第六讲栈和队列(一)增加 1/13.
数据结构 Data Structure 中南大学 主讲人:王国军,郑瑾 中南大学信息院计科系
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
第一章 绪论.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第3章 栈和队列 3.1 栈 本章主题:栈和队列的应用 教学目的:掌握栈和队列的应用方法,理解栈的重要作用
数 据 结 构 刘家芬 Sept 2012.
第二章 Java语言基础.
第三章 栈和队列.
#define STACK_INIT_SIZE 10
第3章 栈和队列 ——操作受限的线性表 3.1 栈 3.1.1抽象数据类型栈的定义 3.1.2栈的表示与实现
資料結構 第4章 堆疊.
严蔚敏、吴伟民编著 清华大学出版社 学习网站:
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
数据结构概论 第3章 栈和队列 董黎刚 浙江工商大学信电学院 2019年2月25日.
计算机软件技术基础 数据结构与算法(3).
第三章 栈和队列 第二部分 队列(Queue) 2019/4/8.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
顺序表的删除.
top b top a a top 空栈 a 进栈 b 进栈 top top e e e top d d d c c c b b b a a
数据结构习题课 信息学院 赵明 2005年秋.
11.1 递归的定义 11.2 常见递归问题 11.3 递归的实现 11.4 递归转化为非递归的一般过程 11.5 递归的时间和空间复杂度
队列及其实现.
Chap2 Stack & Queue.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
第 四 讲 线性表(二).
第 六 讲 栈和队列(一).
本章的基本内容是: ⑴栈和队列的定义及操作特性; 第3章 特殊线性表—栈、队列和串 ⑵栈和队列的两种存储方法和基本运算的实现;
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第七讲 栈和队列(二) 1/.
第3章 栈和队列 3.1 栈 3.2 队列.
Chapter 2 Entity-Relationship Model
第三章 栈和队列.
昆山爱达人信息技术有限公司 QQ: 本节内容 1.栈的链式存储结构及实现 2.栈的应用.
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
13-1 電腦可以協助解決哪些問題 13-2 電腦解題簡介 13-3 電腦解題規劃-演算法 13-4 認識資料結構
Presentation transcript:

第四章 栈和队列 4.1栈 4.2栈的应用 4.3队列 4.3队列应用

4.1栈 定义:栈(Stack)是限定只能在表得一端进行插入和删除操作得线性表,又称限定性线性表结构 4.1.1栈的结构特点和操作 栈顶(Top)、栈底(Bottom),先入后出(LIFO) 栈的基本操作 InitStack(&S) DestroyStack(&S) ClearStack(&S) StackEmpty(S) StackLength(S) GetTop(S,&e) Push(&S, e) Pop(&S,&e) StackTraverse(S)

4.1.2栈的表示和操作的实现 顺序栈 Const STACK_INIT_SIZE=1000; Const STACKINCREMENT=10; Typedef struct{ Selemtype *elem; Int top; Int stacksize; Int increment; }SqStack;

相关操作实现 InitStack_Sq(SqStack &S,int maxsize= STACK_INIT_SIZE, int incresmentize= STACKINCREMENT) GetTop_Sq(SqStack S,SelemType &e) Push_Sq(SqStack &S ,SelemType e) Pop_Sq(SqStack S ,SelemType &e) IncrementStacksize(&S){ SElemtype *a; a=new SElemType[S.stacksize+S. increment]; for(i=0;i<=S.top;i++)a[i]=S.elem[i]; delete [] S.elem; S.elem=a; S.stacksize+=S.increment; }

链栈 typedef LinkList LinkStack; InitStack_L(LinkStack &S) Push_L(LinkStack &S ,SelemType e) Pop_L(LinkStack S ,SelemType &e) Bool GetTop_L(Linkstack S,SElemType &e){ if(!S) return FALSE; e=S->data; return TRUE; }

4.2栈的应用 例4.1数制转换 例4.2括号匹配检验 例4.3 背包问题求解 例4.4 后缀表达式求值 算法4.1 void conversion() N=an*dn+an-1*dn-1+…+a1*d+a0 例4.2括号匹配检验 算法4.2 void matching() 例4.3 背包问题求解 算法4.3 void knapsack() 若可以w[n-1]>T,则应在pop前加入 if(!StackEmpty (S)) 外循环结束条件是:!(StackEmpty(S)&&k==n) 例4.4 后缀表达式求值 算法4.4 void evaluation()

原表达式转化为后缀表达式 规则 1)设立运算符栈 2)设运算符的结束符为“#”预设栈底为“#” 3)若当前字符是操作数,直接发送后缀表达式 算法4.5 void transform(char suffix[],char exp[]) 规则 1)设立运算符栈 2)设运算符的结束符为“#”预设栈底为“#” 3)若当前字符是操作数,直接发送后缀表达式 4)若当前字符是运算符,且优先级大于栈顶运算符,则入栈,否则退出栈顶运算符发送给后缀表达式。 5)若当前字符是结束符“#”,则自栈顶至栈底依次将栈中所有运算符发送给后缀表达式。 6)若当前运算符是“(”,进栈,对其之前底运算符起隔离作用。 7)若当前运算符是“)”,可视为自相应的“(”开始的表达式的结束,从栈顶起依次退出栈顶运算符发送给后缀表达式,直至栈顶相应运算符为“(”,再将“(”也出栈

例4.5 递归函数的实现 算法4.6 int Ackerman(int n,int x,int y) 汉诺塔问题:有三个塔座X、Y、Z,X座上插有n个直径大小各不相同编号为1…n的圆盘。现在要求将X上的圆盘移动到Z塔座上。要求遵循以下规则: 每次只能移动一个圆盘 圆盘可以插在X、Y、Z中任一个上 任何时刻都不能将一个大盘压在小盘上

4.3队列 定义:队列(Queue)是限定只能在表得一端进行插入在表的另一端进行删除操作的线性表 4.3.1队列的结构特点和操作 队列头(front)、队列尾(rear),先入先出(FIFO) 队列的基本操作 InitQueue(&Q) DestroyStack(&S) ClearQueue(&Q) QueueEmpty(Q) QueueLength(Q) GetHead(Q,&e) EnQueue(&Q,e) Dequeue(&Q,&e) QueueTraverse(Q)

4.3.2队列的表示和操作的实现 链队列 表示结构:带头结点的单链表 typedef Linklist Queueptr; typedef struct { Queueptr front; //指向头结点 Queueptr rear; //指向队尾 }LinkQueue; 操作实现 void InitQueue_L(LinkQueue &Q); void DestroyQueue_L(LinkQueue &Q); void EnQueue_L(LinkQueue &Q,Qelemtype e); void DeQueue_L(LinkQueue &Q,Qelemtype &e); 注意:删除元素时为最后一个元素时应改写rear指针。

循环队列:队列首尾相接 表示结构 typedef struct { Qelemtype *elem; int front; int rear; int queuesize; int incrementsize; }SqQueue; 空队列判断 不可用用首尾指针相等来判断队列的空 解决办法:1:增加标志位 2:少用一个元素

实现 InitQueue_Sq(SqQueue &Q,int maxsize,int incresize) 【更正】Q.queuesize=maxsize+1; QueueLength_Sq(SqQueue Q) EnQueue_Sq(SqQueue &Q, ElemType e) Dequeue(SqQueue &Q, ElemType &e)

4.3队列应用 例4.6 打印二项式系数 例4.7 为比赛划分无冲突子集 算法4.7 void yanghui(int n) 注意:最后一行单独处理 例4.7 为比赛划分无冲突子集 算法4.8 void Division(int R[][],int n,int result) 注意:队列是否为空,不能由front和rear相等来判 【更正】EnQueue_Sq函数调用都多一个参数0