用两种方式实现表达式自动计算Word文件下载.docx
《用两种方式实现表达式自动计算Word文件下载.docx》由会员分享,可在线阅读,更多相关《用两种方式实现表达式自动计算Word文件下载.docx(20页珍藏版)》请在冰豆网上搜索。
第二种算法:
先中缀表达式转化为后缀表达式,然后在计算后缀表达式,其流程图为:
图2中缀转后缀算法流程图
图3后缀表达式计算算法流程图
三、源代码
下面给出的是用直接计算算法实现的程序的源代码:
/*Note:
YourchoiceisCIDE*/
/*表达式直接运算*/
#include"
stdio.h"
stdlib.h"
#defineMaxsize100
/////////////////////////////////////////////////////
////定义操作符栈
typedefstruct{/////定义操作符栈
chardata[Maxsize];
inttop;
}Stack;
voidInitStack(Stack*S)/////用于初始化栈
{
S->
top=-1;
}
intpush(Stack*S,charop)//将一个新元素压入栈中
if(S->
top==Maxsize-1)///判断栈是否为空,并进行处理
{
printf("
\nstackisfull"
);
return0;
/////如果栈满则返回0值
}
S->
top++;
data[S->
top]=op;
////把元素压入栈顶
return1;
charpop(Stack*S)/////定义出栈函数
if(S->
top==-1)/////判断栈是否为空
{
printf("
thestackisempty"
return0;
}
returnS->
top--];
/////返回栈顶元素
////////////定义数值栈
typedefstruct{////定义数值栈
doubledata1[Maxsize];
}ODStack;
voidInitStack1(ODStack*S)//////初始化栈
intpush1(ODStack*S,doubleOpNd)//将一个新元素压入栈中
data1[S->
top]=OpNd;
/////把元素压入栈顶
doublepop1(ODStack*S)///////出栈函数
top==-1)//////判断栈是否为空
}
}
/////////定义优先级
intlevel(charoper)
{intlvl;
/////定义记录优先级的变量
switch(oper)
case'
+'
:
lvl=1;
break;
-'
lvl=1;
////定义‘-’‘+’的优先级
*'
lvl=2;
/'
////定义‘*’‘、’的优先级
%'
////定义‘%’的优先级
('
lvl=6;
)'
lvl=0;
////定义‘(’‘)’的优先级
returnlvl;
//////返回操作符的优先级
intprecede(charoper1,charoper2)////进行优先级比较
intresult;
result=level(oper1)-level(oper2);
returnresult;
////返回优先级比较结果
voidmain()
{
doublecalculate(charch[]);
charexpression[Maxsize];
/////声明要使用的函数
Attention!
!
thesideof'
mustbeintgralnumber\n"
pleaseinputtheexpression:
"
gets(expression);
////输入所要计算的算式
thevalueaftercalculatingtheexpressionis:
%.4f\n"
calculate(expression));
//////输出计算结果
////////////////////////////////////////////////////
////////////定义计算表达式
doublecalculate(charch[])
{doublecal(doubletem1,doubletem2,charc);
//////////声明cal()函数
inti=0,k=0;
chartransform[Maxsize],*s_t;
////声明存放数值的字符数组
chartem;
doubled1,d2,od1,od2,result;
StackOptr;
//////声明数值栈
ODStackOpnd;
//////声明操作符栈
InitStack(&
Optr);
///////初始化操作符栈
InitStack1(&
Opnd);
/////初始化数值栈
while(ch[i]!
='
\0'
)/////扫描后缀表达式
if(ch[i]=='
'
)////跳过空格
i++;
if(ch[i]>
0'
&
ch[i]<
9'
||ch[i]=='
.'
)///判断是不是数值
while(ch[i]>
)//将字符转化为浮点型
transform[k]=ch[i];
/////将数值字串的每一个字符赋给trans数组
k++;
transform[k]='
;
///以‘\0’结尾存放数值串
k=0;
s_t=transform;
d1=atof(s_t);
////利用atof()函数将转为浮点型
push1(&
Opnd,d1);
//printf("
thetopofthestackis:
%f\n"
Opnd.data1[Opnd.top]);
else/////对操作符进行操作
{
if(Optr.top==-1)///判断站的状态,空则直接压入
{
push(&
Optr,ch[i]);
/////入栈
}
else
{
if(ch[i]=='
)///判断是不是'
对括号内的表达式进行运算
{
while(Optr.data[Optr.top]!
)////以‘)’为条件处理括号内的操作符
{
tem=pop(&
/////栈顶元素出栈
od2=pop1(&
////将符号右元素出栈
od1=pop1(&
////将符号左元素出栈
d2=cal(od1,od2,tem);
/////调用计算函数
push1(&
Opnd,d2);
////将所得结果压入数值栈