表达式求值数据结构实训报告.docx

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

表达式求值数据结构实训报告.docx

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

表达式求值数据结构实训报告.docx

表达式求值数据结构实训报告

数据结构实训

题目:

表达式求值

学生姓名:

学生学号:

专业班级:

指导老师:

 

1.  课题分析  

1.1需求分析..............................................................

1. 2设计要求  

2.总体设计  

2.1主程序的流程  

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

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

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

3. 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'+':

 

case'-':

return1; 

case'*':

 

case'/':

return2; 

default:

return0; 

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

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

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

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

(4)如果读入的是运算符,并且运算符栈为空,则将该运算符直接进栈;如果栈不为空,则比较该运算符和栈顶运算符的优先级。

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

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

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

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

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

voidSqStack:

:

change(string&s1,string&s2)  

{

stacks; 

s.push('#'); 

inti=0; 

while(i

{

if(s1[i]=='(')    

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

else

if(s1[i]==')')   

{    

while(s.top()!

='(')

{

s2+=s.top();

s2+='';

s.pop(); 

s.pop(); 

i++; 

}

else

if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/') 

{

while(cmp(s.top())>=cmp(s1[i]))

{

s2+=s.top(); 

s2+=''; 

s.pop();

s.push(s1[i]); 

i++;

else

{     

while('0'<=s1[i]&&s1[i]<='9'||s1[i]=='.')

{ s2+=s1[i++]; } 

s2+=''; 

while(s.top()!

='#')

{   

s2+=s.top(); 

s2+=''; 

s.pop(); 

}

3.3后缀表达式求值

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

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

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

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

doubleSqStack:

:

value(string&s2)

{      

stacks; 

doublex,y; 

inti=0; 

while(i

{   

if(s2[i]=='') 

i++; 

switch(s2[i]) 

case'+':

if(s.size()>=2)

{x=s.top();s.pop();x+=s.top();s.pop();i++;break; }

elsereturn0;

case'-':

if(s.size()>=2)

{x=s.top();s.pop();x=s.top()-x;s.pop();i++;break; }

elsereturn0;

case'*':

if(s.size()>=2)

{x=s.top();s.pop();x*=s.top();s.pop();i++;break; }

elsereturn0;

case'/':

if(s.size()>=2)

{x=s.top();s.pop();x=s.top()/x;s.pop();i++;break;}

elsereturn0;

default:

 

x=0; 

while('0'<=s2[i]&&s2[i]<='9')

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

i++; 

if(s2[i]=='.')

doublek=10.0; 

y=0; 

i++; 

while('0'<=s2[i]&&s2[i]<='9')

y+=((s2[i]-'0')/k); 

i++; 

k*=10; 

x+=y; 

}

break;

s.push(x); 

if(s.size()==1)

returns.top();

else

return0;

intmain()

strings1,s2;

SqStackt;

cout<<"请输入中缀表达式:

";

cin>>s1;   

s2="";

t.change(s1,s2);

if(t.value(s2))

{

cout<<"后缀表达式为:

";

cout<

cout<<"表达式的值为:

";

cout<

(2)<

}

else

cout<<"Awronginput!

"<

return0; 

4.测试结果

5.心得体会

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

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

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

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

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

6.参考文献

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

2.数据结构

 

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

当前位置:首页 > 法律文书 > 调解书

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

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