(清华版)数据结构队列1课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《(清华版)数据结构队列1课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 清华 数据结构 队列 课件
- 资源描述:
-
1、Chapter 3:栈、队列第三章 栈和队列3.1 栈 3.1.1 抽象数据类型栈的定义 3.1.2 栈的表示和实现3.2 栈的应用举例 3.2.1 数制转换 3.2.2 括号匹配的检验 3.2.4 行编辑程序 3.2.5 迷宫求解 3.2.5 表达式求值3.1 栈3.1.1栈的逻辑结构栈的逻辑结构 限定仅在表的一端进行插入与删除的线性表。也称作FILO-先进后出(First In Last Out)的线性表。ADT Stack 数据对象:D=ai|ai(-ElemSet,i=1,2,.,n,n=0 数据关系:R1=|ai-1,ai(-D,i=2,.,n 基本操作:InitStack(&S)构
2、造一个空栈S DestroyStack(&S)栈S存在则栈S被销毁 ClearStack(&S)栈S存在则清为空栈栈的抽象数据类型定义:StackEmpty(S)栈S存在则返回TRUE,否则FALSE StackLength(S)栈S存在则返回S的元素个数,即栈的长度 GetTop(S,&e)栈S存在且非空则返回S的栈顶元素 Push(&S,e)栈S存在则插入元素e为新的栈顶元素 Pop(&S,&e)栈S存在且非空则删除S的栈顶元素并用e返回其值 StackTraverse(S,visit()栈S存在且非空则从栈底到栈顶依次对S的每个数据元素调用函数visit()一旦visit()失败,则操作
3、失败 ADT Stack栈的实例1-火车扳道站火车扳道站栈事例2-中断处理 中断1打断过程0,中断2打断中断1,中断3打断中断2 0过程0开始中断处理过程1中断处理过程2中断处理过程3断点1断点2断点33.1.2栈的顺序实现用一组连续的存贮空间存放栈元素 a1 a2 a n-1 a n栈顶 栈底顺序栈的类C语言定义 typedef struct SElemType*base;SElemType*top;/设栈顶栈底两指针的目的是便于判断栈是否为空 int StackSize;/栈的当前可使用的最大容量.SqStack;二、基本操作实现 栈初始化 Status InitStack(SqStack
4、&S)S.base=(SelemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType);if(!S.base)exit(OVERFLOW);S.top=S.base;S.stacksize=STACK_INI_SIZE;return OK;/IniStack 栈清空 Status ClearStack(SqStack&S);S.top=S.base;/ClearStack 判断栈空 Status StackEmpty(SqStack S);if(S.top=S.base)return TRUE;else return FALSE;/StackEmpty 取栈
5、顶元素 Status GetTop(SqStack S,SElemType&e);if(S.top=S.base)return ERROR;e=*(S.top-1);return OK;/GetTop 进栈 Status Push(SqStack&S,SElemType e);if(S.top-s.base=S.stacksize)S.base=(ElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType);if(!S.base)exit(OVERFLOW);S.top=S.base+S.stacksize;S.s
6、tacksize+=STACKINCREMENT;*S.top+=e;return OK;/Push 出栈 Status Pop(SqStack&S,SElemType&e);if(S.top=S.base)return ERROR;e=*-S.top;return OK;/Pop 顺序栈 “上溢”和“下溢”三、多栈共享存贮空间 若系统中使用若系统中使用n个栈,个栈,每个栈的最大尺寸每个栈的最大尺寸ni(i=1,2,n),则则n个栈要预分配的总存贮容量为个栈要预分配的总存贮容量为 如果已知这如果已知这n个栈在任何时刻的总的存贮占用量均不会超过个栈在任何时刻的总的存贮占用量均不会超过N,且有且有
7、N 则可考虑令这则可考虑令这n个栈共享一块大小为个栈共享一块大小为N的存贮区,以节省存的存贮区,以节省存贮空间贮空间。niin1niin12栈共享存贮空间栈1栈2栈1底栈2底栈1顶栈2顶 对于两栈共享存贮空间,可以特殊处理,以避免移动元素。对于两栈共享存贮空间,可以特殊处理,以避免移动元素。方法是将两栈的栈底分别固定在存贮区的两底,两栈指针相向方法是将两栈的栈底分别固定在存贮区的两底,两栈指针相向增长增长3.1.3 栈的链式存贮结构PHead栈顶栈底Null链式栈的结点描述 Typedef struct Lnode ElemType data;struct Lnode*next;Lnode,*
8、LinkList;LinkLista1a2a3a4STop of stack =Front of Linked-list链式栈的基本操作void push(o)/insert o o.next=s.next;s.next=o void pop()/remove most recent item if s=Null printf(“pop fails-empty stack else a=s.data;s=s.next void top()/retrieve most recent item if s=null printf(“top fails-empty stack)else return
9、s.data;上溢问题3.2 栈应用之一:数制转换 将十进制数转换成其它进制的数有一种简单的方法:例:十进制转换成八进制:(66)10=(102)8 66/8=8 余 2 8/8=1 余 0 1/8=0 余 1 结果为余数的逆序:102。void conversion()pSqStack S;SElemType e;int n;InitStack(&S);printf(Input a number to convert to OCT:n);scanf(%d,&n);if(n=0 数据关系:R1=|ai-1,ai(-D,i=2,.,n 基本操作:InitQueue(&Q)构造一个空队列Q Des
展开阅读全文