栈的应用:表达式求值的设计
}
/******返回运算符号的优先级******/ int OperatorValue(char ValueToGive) {
if (ValueToGive == '(') return 6;
if (ValueToGive == ')') return 5;
if (ValueToGive == '^') return 3; if (ValueToGive == '%') return 2;
if (ValueToGive == '*') return 2;
if (ValueToGive == '/') return 2;
if (ValueToGive == '+') return 1;
if (ValueToGive == '-')
return 1; return 0; }
/******计算后缀表达式******/
void Calculate(FILE *Change, Stack Whereat, FILE *Temp) {
FStack Operands; float looker; char Op;
char spacefinder; float answer = 0; float NumA; float NumB;
Operands = (Ptr_Fn)malloc(sizeof(struct FNode)); Operands->Next= NULL;
while ((IsEmpty(Whereat) != 1) && PrintError != 1)
{ /*循环直到Whereat空,或者遇到错误*/
19
栈的应用:表达式求值的设计
if (Top(Whereat) == 'A'){ fscanf(Temp,\ fscanf(Temp,\ /*如果是A,则是操作数*/ FPush(looker,Operands); Pop(Whereat); }
else if (Top(Whereat) == 'B'){ fscanf(Temp,\ /*如果是B,则是运算符*/ Op = getc(Temp); switch(Op){ /* 判断是什么运算符*/
case('^'): /*幂运算*/ NumB = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands)){ /*错误处理*/ PrintError = 1; } else{ NumA = FTop(Operands); FPop(Operands);
if ((NumA == 0 && NumB < 0)||((NumA<0) && (NumB - (int)NumB != 0))) { PrintError = 1; } else{ answer = pow(NumA,NumB); FPush(answer,Operands); }
} break;
case '%': /*取模运算*/ NumB = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands)){ /*错误处理*/ PrintError = 1; } else{ NumA = FTop(Operands);
20
栈的应用:表达式求值的设计
FPop(Operands);
if ((NumA - (int)NumA != 0) || (NumB - (int)NumB != 0) || (NumB == 0)) { PrintError = 1; } else{ answer = (int)NumA % (int)NumB; FPush(answer,Operands); }
} break;
case '*': NumB = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands)){ PrintError = 1; } else{ NumA = FTop(Operands); FPop(Operands); answer = NumA * NumB; FPush(answer,Operands); } break;
case '/': NumB = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands)){ PrintError = 1; } else{ NumA = FTop(Operands); FPop(Operands); if (NumB == 0){ PrintError = 1; }
else{
21
/* x mod b*/ /*乘法运算*/ /* x * y*/ /*除法运算*/ /*分母不为0*/
栈的应用:表达式求值的设计
answer = (float)(NumA / NumB); /* x / y*/ FPush(answer,Operands); } } break;
case '+': /*加法运算*/ NumB = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands)){ PrintError = 1; } else{ NumA = FTop(Operands); FPop(Operands); answer = NumA + NumB; FPush(answer,Operands); } break;
case '-': NumB = FTop(Operands); FPop(Operands);
if (FIsEmpty(Operands)){ PrintError = 1; } else{ NumA = FTop(Operands); FPop(Operands);
answer = NumA - NumB;
FPush(answer,Operands);
} break; default: PrintError = 1; break; } Pop(Whereat); }
} 22
/* x + y*/ /*减法运算*/ /* x - y*/
/*判断结束*/ /*循环结束*/
栈的应用:表达式求值的设计
}
if (!PrintError){ answer = FTop(Operands); FPop(Operands); if (FIsEmpty(Operands) != 1){ fprintf(Change,\ /*如果还有操作数*/ PrintError = 0; } else fprintf(Change,\ }
else{ fprintf(Change,\ PrintError = 0; }
FMakeEmpty(Operands); free(Operands);
23
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库(盐城工学院数据结构课程设计)栈的应用表达式求值(5)在线全文阅读。
相关推荐: