算术表达式求值.docx
《算术表达式求值.docx》由会员分享,可在线阅读,更多相关《算术表达式求值.docx(16页珍藏版)》请在冰豆网上搜索。
算术表达式求值
武汉理工大学《数据结构》课程设计说明书
算术表达式求值
摘要:
对于简单的算术表达式的求值问题我们可以通过栈来实现其功能,这也是栈的运用的一个典型的例子。
关键字:
算术表达式求值栈
1.引言
在计算机中,算术表达式由常量、变量、运算符和括号组成。
由于不同的运算符具有不同的优先级,又要考虑括号,因此,算术表达式的求值不可能严格地从左到右进行。
因而在程序设计时,借助栈实现。
算法输入:
一个算术表达式,由常量、变量、运算符和括号组成(以字符串形式输入)。
为简化,规定操作数只能为正整数,操作符为+、-、*、/、(、),用=表示结束。
算法输出:
表达式运算结果。
算法要点:
设置运算符栈和运算数栈辅助分析算符优先关系。
在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应运算。
2.需求分析
现实生活中有许多算术表达式求值问题,对于一些简单的表达式求值问题,我们可以通过此程序实现。
武汉理工大学《数据结构》课程设计说明书
3.概要设计
3.1数据结构设计
任何一个表达式都是由操作符,运算符和界限符组成的。
我们分别用顺序栈来寄存表达式的操作数和运算符。
栈是限定于紧仅在表尾进行插入或删除操作的线性表。
顺序栈的存储结构是利用一组连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置,base为栈底指针,在顺序栈中,它始终指向栈底,即top=base可作为栈空的标记,每当插入新的栈顶元素时,指针top增1,删除栈顶元素时,指针top减1。
3.2算法设计
为了实现算符优先算法。
可以使用两个工作栈。
一个称为OPTR,用以寄存运算符,另一个称做OPND,用以寄存操作数或运算结果。
1.首先置操作数栈为空栈,表达式起始符“=”为运算符栈的栈底元素;
2.依次读入表达式,若是操作符即进OPND栈,若是运算符则和OPTR栈的栈顶运算符比较优先权后作相应的操作,直至整个表达式求值完毕(即OPTR栈的栈顶元素和当前读入的字符均为”=”)。
4.详细设计
4.1数据存储结构设计
因为表达式是由操作符,运算符和界限符组成的。
如果只用一个char类型栈,不能满足2位以上的整数,所以还需要定义一个int类型的栈用来寄存操作数。
/*定义字符类型栈*/
武汉理工大学《数据结构》课程设计说明书
typedefstruct{
intstacksize;
char*base;
char*top;
}Stack;
/*定义整型栈*/
typedefstruct{
intstacksize;
int*base;
int*top;
}Stack2;
4.2主要算法设计
OperandTypeEvaluateExpression(){
//算术表达式的求值的算符优先算法。
设OPTR和OPND分别为运算符栈和运算栈,
//OP为运算符集合。
InitStack(OPTR);Push(OPTR,'=');
InitStack(OPND);c=getchar();
While(c!
='='||GetTop(OPTR)!
='='){
if(!
In(c,OP)){Push(OPND,c);c=getchar();}//不是运算符则进栈
else
switch(Precede(GetTop(OPTR),c)){
case'<':
//栈顶元素优先权低
Push(OPTR,c);c=getchar();
break;
case'=':
//脱括号并接收下一字符
Pop(OPTR,x);c=getchar();
武汉理工大学《数据结构》课程设计说明书
break;
case'>':
//退栈并将运算结果入栈
Pop(OPTR,theta);
Pop(OPND,b);Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
break;
}//switch
}//while
returnGetTop(OPND);
}//EvaluateExpression
5.程序实现与测试
程序源代码
#include
#include
#include
#include
#include
#include
usingnamespacestd;
structoptr//存放操作符的栈
{
char*base;
char*top;
intsize;
};
structopnd//存放操作数的栈
武汉理工大学《数据结构》课程设计说明书
{int*base;
int*top;
intsize;
};
voidInitStack(structoptr*s)
{
s->base=(char*)malloc(50*sizeof(char));
s->top=s->base;
s->size=50;
}
voidInitStack(structopnd*s)
{
s->base=(int*)malloc(50*sizeof(int));
s->top=s->base;
s->size=50;
}
structoptr*Push(structoptr*stack,charopp)
{
*stack->top=opp;
stack->top++;
returnstack;
}
structopnd*Push(structopnd*stack,intnum,inti)
{
*stack->top=num;
stack->top++;
returnstack;
武汉理工大学《数据结构》课程设计说明书
}
charGetTop(structoptr*stack)//取栈顶元素
{
return*(stack->top-1);
}
intGetTop(structopnd*stack)//取栈顶元素
{
return*(stack->top-1);
}
boolIn(charopp)
{
if(opp!
='+'&&opp!
='-'&&opp!
='*'&&opp!
='/'&&opp!
=
'('&&opp!
=')'&&opp!
='=')
{
returnfalse;
}
else
{
returntrue;
}
}
charPreCede(charoldChar,charnewChar)
{
intoldInt,newInt;
switch(oldChar)
{
武汉理工大学《数据结构》课程设计说明书
case'+':
{
oldInt=4;
break;
}
case'-':
{
oldInt=4;
break;
}
case'*':
{
oldInt=6;
break;
}
case'/':
{
oldInt=6;
break;
}
case'(':
{
oldInt=2;
break;
}
case')':
{
oldInt=7;
武汉理工大学《数据结构》课程设计说明书
break;
}
case'=':
{
oldInt=0;
break;
}
};
switch(newChar)
{
case'+':
{
newInt=3;
break;
}
case'-':
{
newInt=3;
break;
}
case'*':
{
newInt=5;
break;
}
case'/':
{
newInt=5;
武汉理工大学《数据结构》课程设计说明书
break;
}
case'(':
{
newInt=7;
break;
}
case')':
{
newInt=2;
break;
}
case'=':
{
newInt=0;
break;
}
};
if(oldInt>newInt)
{
return'>';
}
if(oldInt{
return'<';
}
if(oldInt==newInt)
{
武汉理工大学《数据结构》课程设计说明书
return'=';
}
}
intAdd(inta,intb)
{
return(a+b);
}
intminute(inta,intb)
{
return(a-b);
}
intmultiply(inta,intb)
{
return(a*b);
}
intdivision(inta,intb)
{
return(a/b);
}
intOperate(inta,chartheta,intb)
{
switch(theta)
{
case'+':
{
returnAdd(a,b);
}
case'-':
武汉理工大学《数据结构》课程设计说明书
{
returnminute(a,b);
}
case'*':
{
returnmultiply(a,b);
}
case'/':
{
returndivision(a,b);
}
}
}
intmain(intargc,char*argv[])
{
charstring[80];//建立一个字符串用来存放表达式
chartemp;
intstringCount=0;
structoptr*stackOpp=(structoptr*)malloc(sizeof(optr));
structopnd*stackNum=(structopnd*)malloc(sizeof(opnd));
cout<<"请输入算术表达式:
"<cin>>string;
InitStack(stackOpp);
stackOpp=Push(stackOpp,'=');
InitStack(stackNum);
temp=string[stringCount];
stringCount++;
while(temp!
='='||GetTop(stackOpp)!
='=')
武汉理工大学《数据结构》课程设计说明书
{
if(!
In(temp))
{
intvalue=(int)temp-48;
stackNum=Push(stackNum,value,0);
cout<temp=string[stringCount];
stringCount=stringCount+1;
}
else
{
switch(PreCede(GetTop(stackOpp),temp))
{
case'<':
{
stackOpp=Push(stackOpp,temp);
temp=string[stringCount];
stringCount++;
break;
}
case'>':
{
inta=(int)*(--stackNum->top);
cout<intb=(int)*(--stackNum->top);
chartheta=*(--stackOpp->top);
stackNum=Push(stackNum,Operate(b,theta,a),0);
cout<武汉理工大学《数据结构》课程设计说明书
break;
}
case'=':
{
stackOpp->top--;
temp=string[stringCount];
stringCount++;
break;
}
}
}
}
printf("\n运算结果是:
%d\n",GetTop(stackNum));
return0;
}
1.运行成功后界面。
2.输入正确表达式。
武汉理工大学《数据结构》课程设计说明书
6.不足之处
该程序只能实现一位数的算术表达式求值。
7.心得体会
这次课程设计让我更加了解大一学到的C和这个学期学到的数据结构。
课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力和更加了解编程思想和编程技巧。
这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。
程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。
在具体操作中这学期所学的数据结构的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C语言具有的语句简洁,使用灵活,执行效率高等特点。
发现上机的重要作用,特别对算术表达式有了深刻的理解。
武汉理工大学《数据结构》课程设计说明书
参考文献:
1.《数据结构(C语言版)》严蔚敏清华大学出版社
2.《C++语言程序设计》郑莉清华大学出版社
3.《C程序设计》谭浩强清华大学出版社