用两种方式实现表达式自动计算
s=trans;
d=atof(s);
}
if(c=='+'||c=='-') /*如果是+-*/ {
tempn.op=c; if(ms.size==0) { } else {
templn=top(&ms);
{
push(&ms,tempn); /*栈为空直接入栈*/
push2(&mns,d); /*转化为浮点数入栈*/
tempn.level=1; /*优先级设为1*/
while (templn.level>=tempn.level) /*栈顶优先级高*/
templn=pop(&ms); /*取出操作数和操作符计算*/
odb=pop2(&mns); }
if(c=='*'||c=='/'||c=='%') {
tempn.op=c; if(ms.size==0) { } else {
templn=top(&ms);
push(&ms,tempn); /*栈空直接入栈*/
}
}
oda=pop2(&mns);
push2(&mns,odr); /*结算结果入栈*/ if(ms.size>0) {
templn=top(&ms); /*如果栈空结束*/ } else
break;
odr=calculate(oda,odb,templn);
push(&ms,tempn); /*操作符入栈*/
tempn.level=2; /*定义优先级为2*/
while (templn.level>=tempn.level) /*栈顶优先级高*/
- 11 -
用两种方式实现表达式自动计算
}
tempn=top(&ms); while(1) {
templn=pop(&ms); }
if(c=='(') /*如果是左括号*/ { }
if(c==')') /*如果是右括号*/ { }
{ }
pop(&ms); /*取出左括号*/
odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/ oda=pop2(&mns); push2(&mns,odr); if (ms.size>0)
tempn.level=-1;
tempn.op=c; /*直接入栈优先级定位-1*/ push(&ms,tempn);
}
{ }
odb=pop2(&mns); oda=pop2(&mns);
push2(&mns,odr); /*结算结果入栈*/ {
templn=top(&ms); } else
break; /*如果栈空结束*/ templn=top(&ms);
templn=pop(&ms); /*取出操作数和操作符计算*/
odr=calculate(oda,odb,templn); if(ms.size>0)
push(&ms,tempn); /*操作符入栈*/
while(tempn.op!='(') /*遇到左括号结束*/ templn=pop(&ms);
odr=calculate(oda,odb,templn); /*计算出结果入栈*/
tempn=top(&ms);
break; /*如果栈空结束*/
else
- 12 -
用两种方式实现表达式自动计算
odb=pop2(&mns); /*从数栈中取两个数,从符号栈里取操作符*/
oda=pop2(&mns);
odr=calculate(oda,odb,templn); /*计算出结果入栈*/ }
result =pop2(&mns); /*最后的结果在数值栈中返回*/ return result; }
double calculate(double od1,double od2,OpNode op) /*已知操作符和操作数的计算*/ {
switch(op.op) {
case '+' : return od1+od2;
case '-' : return od1-od2; /*判断操作符是哪个执行相应计算*/ case '*' : return od1*od2; push2(&mns,odr); if (ms.size>0)
tempn=top(&ms);
/*如果栈空结束*/
else break;
case '/' : return od1/od2;
case '%' : return (double)((int)od1%(int)od2); }
int check(char str[],char chestr[100]) /*容错函数*/ {
char c;
char cdivide;
int i=0; /*str的索引*/ stack che; /*括号匹配用到的栈*/ OpNode temp;
int k=0; /*chestr的索引*/
int isinteger(char integer[100]); /*%计算是判断是否是整数*/ char s1[10]; /*%操作时存储%左右的数字*/ char s2[10];
int indexs1=0; /*s1s2的索引*/ int indexs2=0; init (&che);
int flag=0; /*0--没有出错1--有错*/ int tag=0;
c=str[i]; /*开始扫描*/
int j; /*数组chestr索引*/ for(j=0;j<99;j++) { }
return 0; /*如果上面的都没有执行返回0*/
- 13 -
用两种方式实现表达式自动计算
}
chestr[j]='\\0'; while(c!='\\0') { {
chestr[j]=' '; /*数组初始化待以后加入'^'*/
if(c=='(') /*如果是左括号就入栈*/
temp.op=c; push(&che,temp);
直存*/
}
if(c==')') /*如果是右括号*/ { if(che.size>0) {
pop(&che); /*栈不为空就取出一个左括号*/ } else { flag=1;
printf(\缺少左括号\\n\ /*否则提示有错*/ chestr[i]='^';
/*右括号下加'^'*/
}
} if(c=='/') /*判断除数是否为0*/
{ j=0;
cdivide=str[i+1+j]; /*取出除号后的数*/
while(cdivide>='0'&&cdivide<='9'||cdivide=='.') /*如果是数或小数点就一
{ s1[j++]=cdivide; if(cdivide!='0'&&cdivide!='.') /*如果不是0则正确并结束*/ { tag=1;
break;
}
cdivide=str[i+j+1];
} if(!tag) /*如果tag为0则存在错误除数为0*/
{ chestr[i+1]='^';
flag=1; /*flag为1表示有错*/
}
}
- 14 -
用两种方式实现表达式自动计算
*/
扫描*/
数点*/
*/
}
int isinteger(char integer[100]) /*判断数组内是否是整数*/ {
int i=0; /*传过来的数组的索引*/ char c; c=integer[i++]; }
if(che.size>0)
{ /*如果最后栈不为空*/ }
printf(\缺少右括号\\n\ /*栈中还有没配对的左括号报错*/ } i++;
c=str[i]; /*检索下一个字符*/
{ }
if(isinteger(s2)) /*调用函数判断s2内存到是否是整数*/ { }
printf(\取余算法第二个数应为整数运算\\n\
flag=1; /*记录为有错*/ printf(\取余算法第一个数应为整数运算\\n\
flag=1; /*记录为有错*/
}
if(isinteger(s1)) /*调用函数判断s1内存到是否是整数
s2[indexs2++]=str[i+indexs2+1]; /*放在s1中*/
||str[i+indexs2+1]=='.')
{ /*如果是数或小
} /*放在s1中*/ while(str[i+indexs2+1]>='0'&&str[i+indexs2+1]<='9' /*以%为中心向后
if(c=='%') /*取余操作的容错*/ {
while(str[i-indexs1-1]>='0'&&str[i-indexs1-1]<='9' {
s1[indexs1++]=str[i-indexs1-1]; /*如果是数或小数点 ||str[i-indexs1-1]=='.') /*以%为中心向前扫描*/
chestr[i-indexs1]='^';
chestr[i+indexs2]='^';
return flag; /*返回是否有错*/
- 15 -