表达式求值数据结构实训报告.docx
《表达式求值数据结构实训报告.docx》由会员分享,可在线阅读,更多相关《表达式求值数据结构实训报告.docx(10页珍藏版)》请在冰豆网上搜索。
表达式求值数据结构实训报告
数据结构实训
总
结
报
告
题目:
表达式求值
学生姓名:
学生学号:
专业班级:
指导老师:
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.数据结构