版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、3.2 栈的应用举例3.2.5 表达式求值 算符优先法:4+2*3-10/5 = 4+6-10/5 = 10-10/5 =10-2 = 8 操作数(operand): 进OPND栈 操作符(operator): 进OPTR栈 界限符(delimiter):算符间的优先关系:1 2+-*/()# + - * / ( # =Precede: 判定运算符栈的栈顶运算符1与读入的运算符2之间 的优先关系的函数.Operate: 进行二元运算ab的函数.算术表达式求值过程(算法3.4)OperandType EvaluateExpression()InitStack(OPTR); Push(OPTR,
2、#); InitStack(OPND); c = getchar(); While(c!=# | GetTop(OPTR)!=#) If(!In(c,OP) Push(OPND,c); c = getchar(); / 不是运算符则进栈 else switch(Precede(GetTop(OPTR),c) case : / 退栈并将运算结果入栈 Pop(OPTR,theta); Pop(OPND,b);Pop(OPND,a); Push(OPND,Operate(a,theta,b); break; default: printf(“Expression error!”); return(E
3、RROR); / switch / while return GetTop(OPND); / EvaluateExpression对算术表达式3*(7-2)求值.步骤 OPTR栈 OPND栈 输入字符 主要操作1 # 3 * ( 7 - 2 ) # Push(OPND,3)2 # 3 * ( 7 - 2 ) # Push(OPTR,*)3 # * 3 ( 7 - 2 ) # Push(OPTR,()4 # * ( 3 7 - 2 ) # Push(OPND,7)5 # * ( 3 7 - 2 ) # Push(OPTR,-)6 # * ( - 3 7 2 ) # Push(OPND,2)7 #
4、 * ( - 3 7 2 ) # Operate(7,-,2)8 # * ( 3 5 ) # POP(OPTR)9 # * 3 5 # Operate(3,*,5)10 # 15 # Return(GetTop(OPND)例:汉诺塔问题:将a柱子上的盘移到 c柱,用 b柱放临时盘 要求:一次只能移动一个盘,大盘不可放于小盘上。abchanoi塔问题定义函数:movetower(n,a,c,b) n个盘ac,b放临时盘分三步: movetower(n-1,a,b,c) 将n-1个盘从a-b, c放临时盘 movedisk(a,n,c) 将第n个盘从a-c movetower(n-1,b,c,a)
5、 将n-1个盘从b-c,a放临时盘void hanoi(int n, char a, char b, char c)if (n=1) move(a,1,c); else hanoi(n-1,a,c,b); move(a,n,c); hanoi(n-1,b,a,c); hanoi塔的递归算法3.4 队列3.4.1抽象数据类型队列的定义队列(Queue): 先进先出(First In First Out) (缩写为FIFO)的线性表。仅在队尾进行插入和队头进行删除操作的线性表。队头(front): 线性表的表头端,即可删除端。队尾(rear): 线性表的表尾端,即可插入端。队头对尾.a1a2a3a
6、n-1an入队列(Enqueue)出队列(Dequeque)队列的抽象数据类型ADT Queue 数据对象:D = ai | ai属于Elemset, (i=1,2,n, n0)数据关系:R1 = ai-1,ai|ai-1,ai属于D,(i=2,3,n) 约定an为队尾, a1为队头。 基本操作: InitQueue(&Q); DestroyQueue (& Q); ClearQueue (& Q); QueueEmpty(Q); QueueLength(Q) ; GetHead(Q,&e); EnQueue (& Q,e); DeQueue (& Q,&e); QueueTraverse(Q
7、 ,visit () ADT Queue队列的基本操作(之一)InitQueue (&Q) 操作结果:构造一个空的队列Q。DestroyQueue (&Q) 初始条件: 队列Q已经存在。 操作结果: 销毁队列Q。ClearQueue (&Q) 初始条件: 队列Q已经存在。 操作结果: 将队列Q重置为空队列。队列的基本操作(之二)QueueEmpty(Q)初始条件: 队列Q已经存在。操作结果: 若队列Q为空队列,则返回TURE;否则返回FALSE。QueueLength(Q) 初始条件: 队列Q已经存在。 操作结果: 返回队列Q中的数据元素个数, 即队列Q的长度。GetHead(Q,&e) 初始
8、条件: 队列Q已经存在且非空。 操作结果: 用e返回队列Q中队头元素的值。队列的基本操作(之三)EnQueue (&Q,e)初始条件: 队列Q已经存在。操作结果: 插入元素e为新的队尾元素。DeQueue (&Q,&e)初始条件: 队列Q已经存在且非空。操作结果: 删除队列Q 的队头元素并用e返回其值。QueueTraverse(Q,visit ()初始条件: 队列Q已经存在且非空。操作结果: 从队头到队尾依次对队列Q的每个元素调用函数visit ()。一旦visit ()失败,则操作失败。3.4.2 链队列 - 队列的链式表示与实现typedef struct QNode QElemType
9、 data; struct QNode *next; Qnode, *QueuePtr;typedef struct QueuePtr front; / 队头指针 QueuePtr rear; / 队尾指针 LinkQueue;#define OK 1#define OVERFLOW -1#define ERROR 0data*nextfrontrear链队列示意图frontrearfrontrear赵frontrear钱赵frontrear钱赵(a)空队列(b)元素“赵”入队列(c)元素“钱”入队列(d)元素“赵”出队列链队列的操作实现举例/* InitQueue 构造一个空的队列Q*/St
10、atus InitQueue(LinkQueue &Q) Q.rear=(QueuePtr)malloc(sizeof(QNode) ); Q.front = Q.rear; if(!Q.front) return(OVERFLOW); Q.front - next = NULL; return OK; / InitQueue链队列的操作实现(DestroyQueue) / 销毁队列QStatus DestroyQueue(LinkQueue &Q) while(Q.front ) Q.rear = Q.front - next; free(Q.front); Q.front = Q.rear
11、; return OK; / DestroyQueue链队列的操作实现(EnQueue) / 插入元素e为新的队尾元素Status EnQueue(LinkQueue &Q, QelemType e) p = ( QueuePtr )malloc(sizeof(QNode); if(!p) return(OVERFLOW); p-data = e; p - next = NULL; Q.rear -next = p; Q.rear = p; return OK; / EnQueue链队列的操作实现(DeQueue)/ 若队列不空, 删除队列Q 的队头元素并用e返回其值, 同时返回OK; 否则返
12、回ERROR 。Status DeQueue(LinkQueue &Q, QelemType &e) if(Q.front = Q.rear) retrun 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; / DeQueue3.4.3 循环队列 - 队列的顺序表示与实现采用顺序存储结构约定:1)初始空队列:front = rear=0 ; 2)插入新的元素时, rear+; 3)删除队头元素时,front+;J1
13、J2J3Q.frontQ.rearJ3Q.frontQ.rearJ5J6Q.frontQ.rearQ.rearQ.front102354循环列表-解决数组越界但未占满空间的办法10maxsize-1.Q.frontQ.rear.队列当Q.rear Q.front时: Q.rear Q.front = 队列中元素个数当Q.rear Q.front时: Q.rear Q.front +maxsize = 队列中元素个数当Q.rear = Q.front时: 队列是空或满循环队列的头尾指针012345J3J4J5Q.rearQ.front(a)一般队列012345Q.rearQ.front(c)空队
14、列J6J3J4J5012345J7J8Q.rearQ.front(b)满队列循环队列-队列的顺序存储结构实现(1)typedef struct QElemType *base; / 存储空间基地址 int front; / 队头指针 int rear; / 队尾指针 SqQueue;#define MAXSIZE 100Status InitQueue(SqQueue &Q)Q.base=(QElemType*)malloc(sizeof(QElemType) *MAXSIZE ); if(!Q.base) return(OVERFLOW); Q.front = Q.rear = 0; return OK; / InitQueue循环队列-队列的顺序存储结构实现(2)Status EnQueue(SqQueue &Q, QelemType e) if(Q.rear+1)% MAXSIZE = Q.front) return(ERROR); Q.baseQ.rear = e; Q.rear = (Q.rear+1) % MAXSIZE; return OK; / EnQueue循环队列-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婴儿床市场需求与消费特点分析
- 药店员工年会上台讲话发言稿范文5篇
- 滑雪单板板面产业链招商引资的调研报告
- 全国人教版初中信息技术七年级上册第五单元第16课二、《网上购物》说课稿
- 《数据的价值》说课稿
- 第 6课 我参与 我奉献 第 4课时《参与公益》说课稿-2023-2024学年道德与法治五年级下册统编版
- 印刷的收据簿市场需求与消费特点分析
- 《凤仙花开花了》说课稿-2023-2024学年科学四年级下册教科版
- 医用细菌鉴定分析仪市场需求与消费特点分析
- 第19课《资本主义国家的新变化》说课稿-2023-2024学年高一下学期统编版(2019)必修中外历史纲要下
- 生物质能发电技术应用中存在的问题及优化方案
- GA 1809-2022城市供水系统反恐怖防范要求
- 幼儿园绘本故事:《老虎拔牙》 课件
- 2021年上半年《系统集成项目管理工程师》真题
- 一个冬天的童话 遇罗锦
- GB/T 706-2008热轧型钢
- 实验六 双子叶植物茎的初生结构和单子叶植物茎的结构
- GB/T 25032-2010生活垃圾焚烧炉渣集料
- GB/T 13610-2020天然气的组成分析气相色谱法
- 《彩虹》教案 省赛一等奖
- 2023年湖南建筑工程初中级职称考试基础知识
评论
0/150
提交评论