当前位置:文档之家› 算术表达式求值演示程序

算术表达式求值演示程序

'='};//用一维数组存储49种情况
switch(c1)
{
/* i为下面array的横标*/ case '+' : i=0;break;
case '-' : i=1;break;
case '*' : i=2;break;
case '/' : i=3;break;
case '(' : i=4;break;
2)#
Push(OPND', 2')
7
#*(-
4 6 2
)#
Operate(‘6','-','2')
8
#*(
4 4
)#
Pop(OPTR)
9
#*
4 4
#
Operate(‘4','*',4')
10
#
16
#
Return(GetTop2(OPND))
算法伪代码如下:
int EvalExpr()//主要操作函数
Precede(c1, c2)初始条件:c1,c2为运算符。 操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b)初始条件:a,b为整数,op为运算符。操作结果:a与b进行运算,op为运算符,返回其值。num(n)操作结果:返回操作数的长度。
EvalExpr()初始条件:输入表达式合法。 操作结果:返回表达式的最终结果。}ADT Stack
+
-
/
(
)
#
+
>
<
<
<
<
>
>
-
>
>
<
<
<
>
>
>
>
>
>
<
>
>
/
>
>
>
>
<
>
>
(
<
<
<
<
<
=
)
>
>
>
>
>
>
#
<
<
<
<
<
=
算法伪代码如下:
char Precede(char c1,char c2){
static char array[49]={
>',
'>',
'<',
'<',
'<',
'>',
'>',
>',
'>',
主程序的流程:
EvaluateExpression()函数实 现了对表达式 求值的功能,main()函数 直接调用EvaluateExpression()对输入的表达式求值输出。
4.2.3函数的调用关系图
4.3
4.3.1①. Precede(char c1,char c2)判断运算符优先权,返回优先权高的算符间的优先关系如下:
数理学院
课程设计报告书
课程名称数据结构课程设计
设计题目算术表达式求值演示
专业班级
学号
姓名
指导教师
2014年12月
1
2014年12月23~2014年12月29日
2设计目的设计一个程序,演示算符优先法对算术表达式求值的过程。利用算符优先关系,实现 对算术四则混合运算表达式的求值。
3
(1)设置运算符栈和运算数栈辅助分析算符优先关系;
4.2.2
基本操作:
InitStack(&S)操作结果:构造一个空栈S。
GetTop(S)
初始条件:
栈S已存在。
操作结果:
用P返回S的栈顶元素。
Push(&S初始条件:
,ch)栈S已存在。
操作结果:
插入元素ch为新的栈顶元素。
Pop(&S)
初始条件:
栈S已存在。
操作结果:
删除S的栈顶元素。
In(ch)操作结果:判断字符是否是运算符,运算符即返回1
'<',
'<',
'<',
'>',
'>',
>',
'>',
'>',
'>',
'<',
'>',
'>',
>',
'>',
'>',
'>',
'<',
'>',
'>',
<',
'<',
'<',
'<',
'<',
'=',
'!',
>',
'>',
'>',
'>',
'!',
'>',
'>',
<',
'<',
'<',
'<',
'<',
'!',
theta=Pop(&OPTR); b=Pop2(&OPND); a=Pop2(&OPND);
Push2(&OPND,Operate(a,theta,b));
4.1.3输出的形式:运算结果,50。
4.1.4程序所能达到的功能:对表达式求值并输出。
4.2
4.2.1
①.栈的抽象数据类型定义:
ADT Stack{
数据对象:D={ai|ai∈Char,i=1,2 ,n,n≥0}
数据关系:R1={<ai-1,ai>|ai-1,ai∈D,i=2,3n}
约定an端为栈顶,ai端为栈底
(2)在读入表达式的字符序列的同时,完成运算符和运算数的识别处理,以及相应的 运算;
(3)在识别出运算数的同时,要将其字符序列形式转换成整数形式;
(4)在程序的适当位置输出运算符栈、运算数栈、输入字符和主要操作的内容。
4
4.1
4.1.1该程序能实现算术四则运算表达式的求值,显示运算过程。
4.1.2输入的形式:表达式,例如5*(3+7)#。 包含的运算符只能有'+'、'-'、'*'、'/'、' (' ')';
case '(' : j=4;break;
case ')' : j=5;break;
case'#': j=6;break;
}
return (array[7*i+j]); /*返回运算符array[7*i+j]为对应的c1,c2优先关系*/}
②利用该算法对算术表达式4*(6-2)求值操作过程如下:
步骤
OPTR

OPND

输入字符
主要操作
1
#
4*(6-2)#
Push(OPND', 4')
2
#
4
*(6-2)#
Push(OPTR', *')
39;, (')
4
#*(
4
6-2)#
Push(OPND', 6')
5
#*(
4 6
-2)#
Push(OPNR', -')
6
#*(-
4 6
c=*ptr++;
}
else
switch(Precede(GetTop(OPTR),c))
{
case'<': //栈顶元素优先权底
Push(&OPTR,c);
c = *ptr++;
break;
case '='://脱括号并接收下一字符x=Pop(&OPTR);
c = *ptr++;
break;
case'>'://退栈并将运算结果入栈
case ')' : i=5;break;
case'#': i=6;break;}switch(c2){/* j为下面array的纵标*/ case '+' : j=0;break;
case '-' : j=1;break;
case '*' : j=2;break;
case '/' : j=3;break;
{c = *ptr++;
while(c!='#'||GetTop(OPTR)!='#')
相关主题