n_dsdb3幻灯片培训稿.ppt

  1. 1、本文档共42页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
n_dsdb3幻灯片培训稿.ppt

第三章 栈和队列 ;3.1栈 ;栈的ADT描述;顺序栈 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 Typedef struct{ SElemtype *base; SElemtype *top; int stacksize; }SqStack; ;栈的表示和实现 顺序栈 一维数组s[M] 或先分配一个基本容量,逐段扩大;Status InitStack_Sq(SqStack S) { S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if(!S.base)exit(OVERFLOW); S.top=S.base; S.stacksize=STACK_INIT_SIZE; return OK; } //InitStack_Sq Status GetTop_Sq(SqStack S,SelemType e){ if(S.top==S.base)return ERROR; e=*(S.top-1);return OK; } Status Push_Sq(SqStack S ,SelemType e) { … *S.top++=e; … } Status Pop_Sq(SqStack S ,SelemType e){ … e=*--S.top; … };链栈 typedef LinkList LinkStack; InitStack_L(LinkStack S) Push_L(LinkStack S ,SelemType e) Pop_L(LinkStack S ,SelemType e) Status GetTop_L(Linkstack S,SElemType e){ if(!S) return ERROR; e=S-data; return OK; };;;;;1)设立运算符栈 2)设表达式的结束符为“#”预设栈底为“#” 3)若当前字符是操作数,直接发送后缀表达式 4)若当前字符是运算符,且优先级大于栈顶运算符,则入栈,否则退出栈顶运算符发送给后缀表达式。 5)若当前字符是结束符“#”,则自栈顶至栈底依次将栈中所有运算符发送给后缀表达式。 6)若当前运算符是“(”,进栈,对其之前底运算符起隔离作用。 7)若当前运算符是“)”,可视为自相应的“(”开始的表达式的结束,从栈顶起依次退出栈顶运算符发送给后缀表达式,直至栈顶相应运算符为“(”,再将“(”也出栈;后缀表达式求值步骤;汉诺塔问题: 有三个塔座X、Y、Z,X座上插有n个直径大小各不相同编号为1…n的圆盘。现在要求将X上的圆盘移动到Z塔座上。要求遵循以下规则: 每次只能移动一个圆盘 圆盘可以插在X、Y、Z中任一个上 任何时刻都不能将一个大盘压在小盘上;;;;;(1);3.4队列;;表示结构:带头结点的单链表 typedef Linklist Queueptr; typedef struct { Queueptr front; //指向头结点 Queueptr rear; //指向队尾 }LinkQueue; 操作实现 Status InitQueue_L(LinkQueue Q); Status DestroyQueue_L(LinkQueue Q); Status EnQueue_L(LinkQueue Q,QElemtype e); Status DeQueue_L(LinkQueue Q,QElemtype e); 注意:删除元???时为最后一个元素时应改写rear指针。 ;表示结构 typedef struct { QElemtype *base; int front; int rear; }SqQueue; 约定: 空队列front==rear;插入 rear++ ;删除front++ 操作: EnQueue,DeQueue,GetHead,QueueLength 空队列判断 不可用用首尾指针相等来判断队列的空 解决办法:1:增加标志位 2:少用一个元素 ;Q.rear=0 Q.front=0;存在问题 设数组大小为M,则: 当Q.front=0,Q.rear=M时,再有元素入队发生溢出——真溢出 当Q.front?0,Q.rear=M时,再有元素入队发生溢出——假溢出 解决方案 队首固定,每次出队剩余元素向前移动——浪费时间 循环队列 基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若Q.rear+1==M,则令Q.rear=0;;0;*队列应用 ;划分无冲突子集算法描述;;;括号

文档评论(0)

yuzongxu123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档