俩种方法实现表达式求值Word文档格式.docx
- 文档编号:17313340
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:16
- 大小:159.76KB
俩种方法实现表达式求值Word文档格式.docx
《俩种方法实现表达式求值Word文档格式.docx》由会员分享,可在线阅读,更多相关《俩种方法实现表达式求值Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
+'
'
-'
*'
/'
('
)'
#'
};
intisp[7][7]={{3,3,1,1,1,3,3},{3,3,1,1,1,3,3},{3,3,3,3,1,3,3},{3,3,3,3,1,3,3},{1,1,1,1,1,2,0},{3,3,3,3,0,3,3},{1,1,1,1,1,0,2}};
typedefstruct{
charoptr[STACK_SIZE];
inttop;
}stack;
charopnd[STACK_SIZE];
}dstack;
/*定义栈*/
voidInitStack(stack*s)
{
s->
top=-1;
}
voidInitStacks(dstack*s)
/*初始化栈*/
intisempty(stack*s)
if(s->
top==-1)
returntrue;
else
returnfalse;
intisemptyd(dstack*s)
/*判断栈是否为空*/
intisfull(stack*s)
top==(STACK_SIZE-1))
intisfulld(dstack*s)
return(s->
top==(STACK_SIZE-1)?
true:
false);
/*判断栈是否满*/
intpush(stack*s,charc)
if(isfull(s)){
printf("
stackisfull!
\n"
);
}
else{
s->
top++;
optr[s->
top]=c;
intpushd(dstack*s,intn)
if(isfulld(s)){
dstackisfull!
opnd[s->
top]=n;
}/*入栈*/
intpop(stack*s,char*c){
if(isempty(s)){
stackisempty!
*c=s->
top];
top--;
intpopd(dstack*s,int*n){
if(isemptyd(s)){
stackifempty!
*n=s->
}/*出栈*/
chargetoptr(stack*s){
returns->
intgetopnd(dstack*s){
intisoptr(charch){
inti;
for(i=0;
i<
7;
i++){
if(opt[i]==ch)
returntrue;
returnfalse;
intcompare(charch1,charch2){
inti,j,k;
if(ch1==opt[i])
j=i;
if(ch2==opt[i])
k=i;
returnisp[j][k];
intcompute(inta,charoptr,intb){
intresult;
switch(optr){
case'
:
result=a+b;
break;
result=a-b;
result=a*b;
result=a/b;
returnresult;
intexecute(){
inti=0,temp,j,k,m;
charc,op;
char*ch;
stackoptr;
dstackopnd;
InitStack(&
optr);
InitStacks(&
opnd);
push(&
optr,'
printf("
请输入表达式以'
结束\n"
ch=(char*)malloc(50*sizeof(char));
gets(ch);
c=ch[i++];
while(c!
='
||getoptr(&
optr)!
){
if(!
isoptr(c)){
temp=c-'
0'
;
c=ch[i++];
while(!
temp=temp*10+c-'
c=ch[i++];
}
pushd(&
opnd,temp);
else{
switch(compare(getoptr(&
optr),c)){
case1:
push(&
optr,c);
c=ch[i];
i++;
break;
case2:
pop(&
optr,&
op);
c=ch[i++];
case3:
popd(&
opnd,&
j);
k);
m=compute(k,op,j);
pushd(&
opnd,m);
case0:
printf("
wronginput!
returnfalse;
m=getopnd(&
returnm;
voidmain()
result=execute();
结果是%d\n"
result);
下面给出的是用后缀式算法实现的程序的源代码,
malloc.h>
#include<
process.h>
#defineMaxSize50
voidtrans(char*exp,char*postexp)/*中缀式变后缀式函数*/
struct
{
chardata[MaxSize];
/*存放运算符*/
}op;
inti=0;
op.top=-1;
while(*exp!
\0'
)
switch(*exp)
case'
op.top++;
op.data[op.top]=*exp;
exp++;
while(op.data[op.top]!
postexp[i++]=op.data[op.top];
op.top--;
}
exp++;
/*等于左括号时,要释放左括号,即op.top--*/
while(op.top!
=-1&
&
op.data[op.top]!
)/*为加减乘除是都比新进的加减号优先级高,固要先出站再入*/
while(op.data[op.top]=='
||op.data[op.top]=='
'
default:
while(*exp>
*exp<
9'
postexp[i++]=*exp;
postexp[i++]='
/*用#标识一个数值串结束*/
=-1)/*栈中的剩余符号,按优先级依次入栈*/
postexp[i]='
}
floatcompvalue(char*postexp)/*后缀式求值运算函数*/
floatdata[MaxSize];
}st;
floata,b,c,d;
st.top=-1;
while(*postexp!
switch(*postexp)
a=st.data[st.top];
/*退栈取数值a,b;
符号前已有数值*/
st.top--;
b=st.data[st.top];
c=b+a;
st.top++;
st.data[st.top]=c;
break;
c=b-a;
c=b*a;
if(a!
=0)
c=b/a;
\n\t除零错误!
exit(0);
d=0;
while(*postexp>
*postexp<
d=10*d+*postexp-'
/*将d赋值为10乘d与*postexp的ASCII值减数字0的ASCII值的和*/
postexp++;
st.data[st.top]=d;
returnst.data[st.top];
intmain()
charexp[MaxSize],postexp[MaxSize];
while(scanf("
%s"
&
exp)!
=EOF)
trans(exp,postexp);
中缀表达式:
%s\n"
exp);
后缀表达式:
postexp);
值:
%g\n"
compvalue(postexp));
return0;
四、运行结果
图3中缀式运行结果图
图4后缀式运行结果图
五、遇到的问题及解决
这部分我主要遇到了如下两个问题,其内容与解决方法如下所列:
●问题1描述:
不知道如何定义栈。
问题1解决方法:
通过看书,上网查资料,最后会定义并使用栈。
●问题2描述:
不知道如何中缀转后缀。
问题2解决方法:
通过上网查资料,问同学,最后使用数组与栈,成功把中缀式转为后缀式
●问题3描述:
在中缀式里,不知道如何用程序表示运算符的优先级
问题3解决方法:
通过看书,上网查资料,最后定义了一个数组,用数字代表不同优先级。
六、心得体会
经过这学期对数据结构的学习,我们学习了理论知识,了解了数据结构设计的思想,这些知识都为我们的下一步学习打下了坚实的基础。
通过这次作业,一方面是为了检查我们一个学期来我们学习的成果,另一方面也是为了让我们进一步的掌握和运用它,同时也让我们认清自己的不足和加强不足之处和薄弱环节。
说起数据结构,它为程序提供了一种思想。
计算机本身是无生命的机器,要是计算机能够运行起来,为人类完成各种各样的工作,就必须让他执行相应的程序,这些程序都是依靠程序设计语言编写出来的。
它是一种思想,在编写程序时可以方便、灵活地运用。
同时,他还向程序员提供了直接操作计算机硬件的功能,具备低级语言的特点,适合各种类型的软件开发程序设计时,不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获。
在具体操作中这学期所学的数据结构的理论知识得到巩固,达到学以致用的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,发现上机的重要作用,特别对算术表达式有了深刻的理解。
我深深地感谢苏亚光老师给予我的悉心指导、多方面的入微关怀和帮助。
老师渊博的知识、扎实的理论功底、高深的学术造诣、严谨的治学态度和胸怀宽宏的高尚品质,让我受益匪浅,终身难忘。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 方法 实现 表达式 求值