数据结构~栈和队列的应用_表达式的求值.doc_第1页
数据结构~栈和队列的应用_表达式的求值.doc_第2页
数据结构~栈和队列的应用_表达式的求值.doc_第3页
数据结构~栈和队列的应用_表达式的求值.doc_第4页
数据结构~栈和队列的应用_表达式的求值.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2011-2012学年第一学期数据结构课内实验报告实验名:栈和队列的应用:表达式的求值姓 名:学 号:班 级: 指导老师: 日 期: 实验题目: 1、 实验目的:通过此实验进一步理解栈和队列,提高运用理论解决实际问题的能力。2、 实验内容: 例如,输入9-(2+4*7)/5+3# ,并按回车键,即可输出结果如下:表达式的运算结果是:6表达式的后缀表达式为:9 2 4 7 * +5/-3+3、 数据结构及算法思想: 表达式计算是实现程序设计逻辑语言的基本问题之一,也是栈和队列应用的一个典型的例子。该设计是先通过栈将中缀表达式转换为后缀表达式,在转换过程中又用到了队列的操作。而在得到后缀表达式之后,又用到队列的操作对生成的后缀表达式进行计算。在整个设计的实现过程中,用到的都是栈和队列的概念。 4、 模块化分:本程序分为2个模块:(1)中缀表达式转换为后缀表达式;(2)求后缀表达式5、 详细设计及运行结果:(1)中缀表达式转换为后缀表达式void CTPostExp(SeqQueue *Q) SeqStack S; /运算符栈char c,t; InitStack(&S); /初始化栈 Push(&S,#); /压入栈底元素# do /扫描中缀表达式c=getchar();switch(c)case :break; /去除空格符case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9: EnQueue(Q,c);break;case (:Push(&S,c);break;case ):case #:dot=Pop(&S);if(t!=(&t!=#) EnQueue(Q,t);while(t!=(&S.top !=-1);break;case +:case -:case *:case /:while(Priority(c)=0 &ch=9)Push(&S,ch);elsey=Pop(&S)-0;x=Pop(&S)-0;switch(ch)case +:Push(&S,(char)(x+y+0);break; case -:Push(&S,(char)(x-y+0);break;case *:Push(&S,(char)(x*y+0);break;case /:Push(&S,(char)(x/y+0);break; return GetTop(S);输入9-(2+4*7)/5+3# ,并按回车键,输出:表达式的运算结果是:6 表达式的后缀表达式为:9 2 4 7 * +5/-36、 调试情况,设计技巧及体会:表达式是由运算对象、运算符、括号组成的有意义的式子。要写此程序,必须了解到底什么是中缀表达式、后缀表达式并灵活运用栈和队列。7、 源程序清单: #include#define StackSize 100#define QueueSize 100/*队列的相关操作*/typedef char DataType;typedef struct char data100; int front,rear;SeqQueue; /定义队列类型void InitQueue(SeqQueue *Q) /初始化队列 Q-front =0; Q-rear =0;int QueueEmpty(SeqQueue Q) /判空队列return Q.rear =Q.front ;void EnQueue(SeqQueue *Q,DataType x) /入队列if(Q-rear +1) % QueueSize=Q-front )printf(Queue overflow);elseQ-dataQ-rear=x;Q-rear =(Q-rear +1)%QueueSize;DataType DeQueue(SeqQueue *Q) char x;if(QueueEmpty(*Q) return 0;elsex=Q-dataQ-front ;Q-front =(Q-front +1)%QueueSize;return x; /*栈的相关操作*/typedef structDataType data100;int top;SeqStack; /栈类型的定义void InitStack(SeqStack *S) /初始化栈S-top =-1;void Push(SeqStack *S,DataType x) /入栈if(S-top =StackSize-1)printf(Stack ouerflow);elseS-top =S-top +1;S-data S-top =x;DataType Pop(SeqStack *S) /出栈if(S-top =-1) printf(stack underflow);return 0;elsereturn S-dataS-top -;DataType GetTop(SeqStack S) /取栈顶元素if(S.top =-1) printf(stack empty);return 0;elsereturn S.data S.top ; /求运算符优先级函数int Priority(DataType op) switch(op)case (:case #:return 0; case -:case +:return 1;case *:case /:return 2;return -1;void CTPostExp(SeqQueue *Q)SeqStack S; /运算符栈char c,t;InitStack(&S); /初始化栈Push(&S,#); /压入栈底元素#do /扫描中缀表达式c=getchar();switch(c)case :break; /去除空格符case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9: EnQueue(Q,c);break;case (:Push(&S,c);break;case ):case #:dot=Pop(&S);if(t!=(&t!=#) EnQueue(Q,t);while(t!=(&S.top !=-1);break;case +:case -:case *:case /:while(Priority(c)=0 &ch=9)Push(&S,ch);elsey=Pop(&S)-0;x=Pop(&S)-0;switch(ch)case +:Push(&S,(char)(x+y+0);break; case -:Push(&S,(char)(x-y+0);break;case *:Push(&S,(char)(x*y+0);break;case /:Push(&S,(char)(x/y+0);break;return GetTop(S);void main()SeqQueue Q; /定义队列,存放后缀表达式InitQueue(&Q); /初始化队列CTPost

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论