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