数据结构实验报告表达式求值Word下载.docx

上传人:b****6 文档编号:22080985 上传时间:2023-02-02 格式:DOCX 页数:19 大小:42.04KB
下载 相关 举报
数据结构实验报告表达式求值Word下载.docx_第1页
第1页 / 共19页
数据结构实验报告表达式求值Word下载.docx_第2页
第2页 / 共19页
数据结构实验报告表达式求值Word下载.docx_第3页
第3页 / 共19页
数据结构实验报告表达式求值Word下载.docx_第4页
第4页 / 共19页
数据结构实验报告表达式求值Word下载.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

数据结构实验报告表达式求值Word下载.docx

《数据结构实验报告表达式求值Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验报告表达式求值Word下载.docx(19页珍藏版)》请在冰豆网上搜索。

数据结构实验报告表达式求值Word下载.docx

判定s是否为空栈.

6).intOperate(inta,chartheta,intb>

操作数a和b存在,且theta是+、-、*、/四则运算;

返回a与b间theta运算地结果.

7).intIn(chars,char*TestOp>

s为待判断字符,TestOp为已知地算符集合;

s为算符集合中地元素则返回1,否则返回0.

8).intReturnOpOrd(charop,char*TestOp>

op为待确定运算符,TestOp为已知地算符集合;

确定运算符类型.

9).charprecede(chara,charb>

a、b存在;

返回算符a和b地优先权高低.

10).voidPrintOpnd(SqStack*s>

输出运算数栈•

11).voidPrintOptr(SqStack*s>

输出运算符栈•

12).voidStore(char*s,charch>

字符数组s存在,字符ch已知;

将ch存入数组s.

13).voidChange(char*s1,char*s2>

初始条件。

重罪表达式s1已知;

将中缀表达式s1转为后缀表达式s2.

2.本程序包含二个模块:

1)主程序模块;

2)中缀表达式求值模块以及中缀表达式转换为后缀表达式并求值模块

3)模块调用图:

主程序模块

中缀表达式求值模块

中缀表达式转换为后缀表达式并求值模块

(三>

详细设计

1.存储类型,元素类型,结点类型:

typedefstruct{//定义栈

intdata[SIZE]。

inttop。

intbase。

RTCrpUDGiT

}SqStack。

charOPSET[7]={'

+'

'

-'

*'

/'

'

('

>

'

#'

}

//定义OPSET字符数组为算符集合

charPrior[7][7]={

每个模块地分析:

}。

2.

1)主程序模块:

intmain(>

{

chars=0,c。

while(1>

printf("

请输入‘1'

或‘0'

<

1代表中缀表达式,0代表后缀表达式)\n"

c=getchar(>

fflush(stdin>

if(c=='

1'

{//中缀表达式运算结果printf("

%d\n"

EvaluateExpression_1(>

else{//后缀表达式运算结果printf("

EvaluateExpression_2(>

do{scanf("

%c"

&

s>

if(s=='

q'

||s=='

Q'

exit(0>

while(s!

='

\n'

system("

cls"

return0。

2)intEvaluateExpression_1(>

//中缀求值

SqStackOPND,OPTR。

charch,theta,exp[100]={0}。

inti=0,s=0,a=0,b=0,step=0。

InitStack(&

OPND>

OPTR>

Push(&

OPTR,'

gets(exp>

ch=exp[0]。

while(ch!

||GetTop(&

!

{if(!

In(ch,OPSET>

{//不是运算符则进栈if(In(exp[i+1],OPSET>

{//未出现连续数字Push(&

OPND,ch-48>

ch=exp[++i]。

}//if

else//出现连续数字

s=exp[i++]-48。

while(exp[i]>

0'

&

exp[i]<

9'

{s=s*10+exp[i++]-48。

OPND,s>

s=0。

ch=exp[i]。

else

switch(precede(GetTop(&

ch>

{case'

:

//栈顶元素优先权低Push(&

OPTR,ch>

break。

case'

//脱括号并接受下一字符

Pop(&

ch=exp[++i]。

break。

//退栈并将运算结果入栈theta=Pop(&

b=Pop(&

a=Pop(&

OPND,Operate(a,theta,b>

}//switch

}//while

returnGetTop(&

}//EvaluateExpression_1intEvaluateExpression_2(>

{//后缀求值

SqStackOPND。

charch,theta,receive[100]={0},exp[100]={0}。

请输入一个中缀表达式:

\n"

gets(receive>

//输入中缀表达式

Change(receive,exp>

相应地后缀表达式为:

puts(exp>

//输出对应地后缀表达式

while(ch!

if(!

{//不是运算符则压入栈中

if(exp[i+1]=='

'

{//未出现连续数字

Push(&

OPND,ch-48>

i+=2。

else//出现连续数字

while(exp[i]>

O'

ch=exp[++i]。

}//else

else{

theta=ch。

i+=2。

ch=exp[i]。

}//EvaluateExpression_2<

3)函数调用关系图

main(>

EvaluateExpression_1(>

|EvaluateExpression_:

3.完整地程序:

#include"

stdio.h"

stdlib.h"

#defineSIZE80

#defineOK1

#defineERROR0

5PCzVD7HxA

//算符间地优先关系

}。

intGetTop(SqStack*s>

//若栈为空,则返回s地栈顶元素;

否则返回if(s->

top==s->

base>

returnERROR。

return(s->

data[s->

top-1]>

voidPush(SqStack*s,inte>

//插入e为新地栈顶元素s->

top]=e。

s->

top++。

intPop(SqStack*s>

//若栈不空,则删除之,并返回其值;

否则返回inte。

if(s->

base==s->

top>

e=s->

top-1]。

top--。

returne。

voidInitStack(SqStack*s>

//置栈S为空

s->

top=0。

base=0。

intEmpty(SqStack*s>

//判定s是否为空栈

return1。

ERROR

REEOR

return0

intOperate(inta,chartheta,intb>

{

//返回a与b间theta运算地结果

switch(theta>

returna+bcase'

returna-bcase'

returna*bcase'

returna/bdefault:

return0

intIn(chars,char*TestOp>

//s为待判断字符,TestOp为已知地算符集合intFind=0。

for(inti=0。

i<

7。

i++>

if(s==TestOp[i]>

Find=1。

returnFind。

intReturnOpOrd(charop,char*TestOp>

//确定运算符类型,op为待确定运算符,TestOp为已知地算符集合

inti。

for(i=0。

if(op==TestOp[i]>

returni。

charprecede(chara,charb>

//返回算符a和b地优先权高低

returnPrior[ReturnOpOrd(a,OPSET>

][ReturnOpOrd(b,OPSET>

]。

jLBHrnAILg

voidPrintOpnd(SqStack*s>

//输出运算数栈

inti=s->

base。

StackOPND:

"

Empty(s>

for(。

(s->

%d"

s->

data[i]>

}else

"

\n"

voidPrintOptr(SqStack*s>

//输出运算符栈inti=s->

printf("

StackOPTR:

for(。

%c"

voidStore(char*s,charch>

//将ch存入数组schar*p=s。

while(*p>

{p++。

}*p++=ch。

intEvaluateExpression_1(>

InitStack(&

Push(&

gets(exp>

else//出现连续数字{

}Push(&

//退栈并将运算结果入栈

theta=Pop(&

}//EvaluateExpression_1

voidChange(char*s1,char*s2>

//将中缀表达式转为后缀表达式

SqStackOPTR。

charch。

inti=0,sum=0。

ch=s1[0]。

{//不是运算符则进栈if(In(s1[i+1],OPSET>

{//未出现连续数字Store(s2,ch>

Store(s2,'

//存入一个空格

ch=s1[++i]。

while(s1[i]>

s1[i]<

Store(s2,s1[i]>

i++。

ch=s1[i]。

ch=s1[++i]。

Store(s2,Pop(&

//补入一个空格作为间隔

Store(s2,ch>

}//Change

intEvaluateExpression_2(>

//输入中缀表达式Change(receive,exp>

{//不是运算符则压入栈中if(exp[i+1]=='

ch=exp[i]。

}//whilePush(&

}//ifelse{theta=ch。

}//EvaluateExpression_2intmain(>

1代表中缀表达式,0代表后缀表达式)

{//中缀表达式运算结果

else{//后缀表达式运算结果

do{

scanf("

if(s=='

exit(0>

system("

}(四>

程序使用说明及测试结果

1•程序使用说明

1)本程序地运行环境为VC6.0.

2)进入演示程序后即显示提示信息:

请输入‘1'

或’0'

1代表中缀表达式,0代表后缀表达式):

若输入1,则继续输入一中缀表达式,程序将计算出结果;

若输入0,则程序将继续提示:

请输入一个中缀表达式:

输入一中缀表达式

相应地后缀表达式为:

程序此后将显示转换后地后缀表达式,并输出结果•

2.测试结果:

例如:

5*<

6-4)#,输出结果为10.

3.调试中地错误及解决办法.(遇到时给出>

开始套用课本中算法模式,在调试过程中错误重重,经过单步调试后,出现了运行界面,但

是未能输出正确结果;

最后请班上其他同学指点,并改进算法,最终得出程序.XHAQX74J0X

4.运行界面

先输入1,再输入表达式5*<

6-4)#

先输入0,再输入表达式5*<

<五)、实验总结(实验心得>

你在编程过程中花时多少?

零散地时间全部加上,大概有十多个小时•

多少时间在纸上设计?

没有在纸上设计•

多少时间上机输入和调试?

十来个小时•

多少时间在思考问题?

不知道,一两个吧•

遇到了哪些难题?

开始套用课本中算法模式,在调试过程中错误重重,经过单步调试后,出现了运行界面,但是未能输出正确结果;

最后请班上其他同学指点,并改进算法,最终得出程序.LDAYtRyKfE

你是怎么克服地?

克服困难地方法只要是看书查质料,向同学请教,并耐心对程序进行单步调试•

你地收获有哪些?

这次实验我感觉难度很大,花费地时间比较长,但是对我了解要学习数据结构帮助很大•

教师评语:

实验成绩:

指导教师签名:

批阅日期:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 金融投资

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1