表达式求值数据结构实训报告Word文档格式.docx

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

表达式求值数据结构实训报告Word文档格式.docx

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

表达式求值数据结构实训报告Word文档格式.docx

2.总体设计 

2.1主程序的流程 

3.详细设计(步骤及代码实现) 

3. 

1判断运算符优先级..............................................

2中缀表达式转后缀表达式..................................

3后缀表达式求值..................................................

4.测试结果 

5.心得体会 

6.参考文献 

1.课题分析

1.1需求分析

(1)栈“后进先出”的特点。

(2)中缀表达式转后缀表达式,并利用后缀表达式求值。

1.2设计要求

(1)运算对象存在多位整数。

(2)实现表达式错误的报错。

(3)判断运算符优先级。

(4)中缀表达式转后缀表达式。

2.总体设计

2.1主程序的流程

3.详细设计(步骤及代码实现)

3.1判断运算符优先级(乘除优先于加减)

intSqStack:

:

cmp(charch) 

{

switch(ch) 

case'

+'

-'

return1;

*'

/'

return2;

default:

return0;

3.2中缀表达式转后缀表达式

(1)首先置操作数栈为空栈,表达式起始符“#”为运算符栈的栈底元素;

(2)定义一个运算符栈,并输入一个中缀表达式(运算对象存在多位整数,运算符为+、-、*、/、%及括号),然后从中缀表达式中自左至右依次读入各个字符。

(3)在字符串s1读取到的运算对象直接输送到后缀表达式字符串s2,两相邻操作数之间利用空格隔开。

(4)如果读入的是运算符,并且运算符栈为空,则将该运算符直接进栈;

如果栈不为空,则比较该运算符和栈顶运算符的优先级。

若该运算符高于栈顶运算符的优先级,则将该运算符直接进栈;

若该运算符低于或等于栈顶运算符的优先级,则将栈中高于或等于该运算符优先级的元素依次出栈,然后再将该运算符进栈。

出栈的运算符输入到s2中,利用空格隔开。

(5)如果读入的是开括号“(”,则直接进栈;

如果读入的是闭括号“)”,则一直出栈并输出到后缀表达式,知道遇到一个开括号“(”为止。

开括号“(”和闭括号“)”均不输出到后缀表达式。

(6)重复345步,直到中缀表达式结束,然后将栈中剩余的所有运算符依次出栈。

voidSqStack:

change(string&

s1,string&

s2) 

stack<

char>

s;

s.push('

#'

);

inti=0;

while(i<

s1.length()) 

if(s1[i]=='

('

) 

s.push(s1[i++]);

else

)'

while(s.top()!

='

{

s2+=s.top();

s2+='

'

;

s.pop();

i++;

}

if(s1[i]=='

||s1[i]=='

) 

while(cmp(s.top())>

=cmp(s1[i]))

s.push(s1[i]);

else

while('

0'

<

=s1[i]&

&

s1[i]<

9'

.'

s2+=s1[i++];

while(s.top()!

}

3.3后缀表达式求值

(1)定义一个double型的运算数栈,将中缀表达式转换得到的后缀表达式字符串自左向右依次读入。

(2)如果读入的是运算对象,则将该运算对象串(下一个逗号分隔符前的部分所构成的数字字符串)转换为对应的多位整数值,然后将该整数值(将自动类型转换为double型)直接进入运算数栈。

(3)如果读入的是运算符,则立即从运算数栈中弹出两个运算数,计算两个运算数运算后的值(运算时先出栈的元素放在运算符后面,后出栈的元素放在运算符前面),并将计算结果存回运算数栈。

(4)重复2、3步,直到后缀表达式结束,最后栈中保存的那个数即为该后缀表达式的计算结果。

doubleSqStack:

value(string&

s2)

double>

doublex,y;

s2.length()-1)

if(s2[i]=='

switch(s2[i]) 

if(s.size()>

=2)

{x=s.top();

s.pop();

x+=s.top();

i++;

break;

}

elsereturn0;

{x=s.top();

x=s.top()-x;

x*=s.top();

x=s.top()/x;

x=0;

=s2[i]&

s2[i]<

x=x*10+s2[i]-'

doublek=10.0;

y=0;

y+=((s2[i]-'

)/k);

k*=10;

x+=y;

break;

s.push(x);

if(s.size()==1)

returns.top();

return0;

intmain()

strings1,s2;

SqStackt;

cout<

<

"

请输入中缀表达式:

cin>

>

s1;

s2="

t.change(s1,s2);

if(t.value(s2))

后缀表达式为:

s2<

endl;

表达式的值为:

fixed<

setprecision

(2)<

t.value(s2)<

Awronginput!

4.测试结果

5.心得体会

通过这该程序的编写,我发现了学习上的挺多问题,尤其在遇到指针的问题的时候,很茫然,以后在学习中要多注意指针的使用,以达到熟练掌握的程度,平时的学习中一定要多写程序,多写一些才回把知识用得自然。

这次实验中我熟练掌握了栈的应用,并练习了串与数组的相关操作。

其实大一就开始学习C语言,可是,当时学的时候就觉得语言好像是学会了,可是一遇到编程的问题还是头大,总感觉没有什么思路,而这次作业,给自己一个不得不动手操作的机会,在十一的这几天中,复习了以前学过的C的基本知识,然后一点一点的摸索,遇到了错误和同学一起讨论,有问题自己想办法解决,最后程序调试出来的时候,会觉得真的很高兴。

我知道,我们现在的水平还很差,要想学习好这门课,在以后就要多动手操作,书上的例题或算法,最好都自己编写程序实现,那样可以加深对算法的理解,也可以提高我们编程的水平。

同时,很多的东西,理解了,可是在实现的时候还是有很多的错误发生,在以后的练习和实践中,应该多动手,遇到问题多思考,即使方案不是最优的也要想办法自己解决,然后和好的方案进行比较,从中找出自己的差距在哪里。

6.参考文献

1沈俊,缪潍扣,顾训穰编著,数据结构—C++实现(第二版)

2.数据结构

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

当前位置:首页 > 职业教育 > 中职中专

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

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