/*******
Whereat ˵Ã÷:
Whereat ¼Ç¼Á˲Ù×÷ÊýºÍÔËËã·ûºÅµÄλÖã¬ÓÃAºÍBÇø·Ö¡£A = operand, B = operator. (ÀýÈç 1+2ת»»³É12+,ÔÚwhereatÖеÄÐÎʽӦ¸ÃÊÇ AAB) OpHolder˵Ã÷:
CharÀàÐ͵ĶÑÕ»OpholderÓÃÀ´±£´æÔËËã·ûºÅ¡£ ******/
/******½«ÖÐ׺±í´øÊ½×ª»»Îªºó׺±í´ïʽ******/
void ConvertToPost(FILE *In, Stack Whereat, FILE *Temp) {
Stack OpHolder; char holder; char lastseen;
int digitcounter = 0; /*²Ù×÷ÊýµÄ¼ÆÊýÆ÷*/ OpHolder = malloc(sizeof(struct Node)); /*³õʼ»¯*/ OpHolder->Next = NULL; holder=getc(In);
lastseen = '@'; /*ÓÃÀ´·ÀÖ¹ÊäÈë¸ñʽ´íÎó£¬ÀýÈçÁ½¸öСÊýµã*/ putc(' ',Temp);
while ((holder !='\\n') && (holder != EOF)){ if (holder == ' '){ digitcounter = 0; } else if ( IsOperator(holder) == -1){ /*Èç¹ûholder²»ÊDzÙ×÷Êý»òÔËËã·ûºÅ*/ PrintError = 1; }
else if (IsOperator(holder)==0){ if ((lastseen == holder) && (lastseen == '.')){ /*´íÎó´¦Àí*/ PrintError = 1; } else lastseen = holder; if (digitcounter == 0){ Push('A',Whereat); /*½øÕ»*/ digitcounter++; /*¼ÆÊýÆ÷¼ÓÒ»*/ putc(' ',Temp);
} putc(holder,Temp); } else{ digitcounter = 0; if ((lastseen == holder) && (lastseen != '(') && (lastseen != ')')) /*\Çé¿öÌØÊâ¶Ô´ý*/ PrintError = 1; else lastseen = holder; 6))
if(IsEmpty(OpHolder)==1){ /*µ±OpHolderΪ¿Õ*/ Push(holder,OpHolder); }
else if(OperatorValue(Top(OpHolder)) == 6){ /*OpHolderÊÇ\µÄÇé¿ö*/ if(OperatorValue(holder)==5) Pop(OpHolder); else Push(holder,OpHolder); }
else if(OperatorValue(holder) == 6){ Push(holder,OpHolder); }
else if(OperatorValue(holder) == 5){ /* OpHolderÊÇ\µÄÇé¿ö*/ while ((IsEmpty(OpHolder) != 1) && (OperatorValue(Top(OpHolder)) != {
putc(' ',Temp);
Push('B',Whereat);
putc(Top(OpHolder),Temp); Pop(OpHolder); } if (IsEmpty(OpHolder) == 1){ /*´íÎó´¦Àí,À¨ºÅ²»Æ¥Åä*/ PrintError = 1; } else Pop(OpHolder); }
else if((OperatorValue(holder) == OperatorValue(Top(OpHolder)))
&& (OperatorValue(holder) == 3)){ /*ÃÝÔËËãÇé¿ö*/ Push(holder,OpHolder); }
else if((OperatorValue(holder) < OperatorValue(Top(OpHolder))) && OperatorValue(Top(OpHolder)) == 3){ /*ÃÝÔËËãÇé¿ö*/ putc(' ',Temp); Push('B',Whereat); putc(Top(OpHolder),Temp); Pop(OpHolder); while((IsEmpty(OpHolder) != 1) && (OperatorValue(Top(OpHolder)) }
{ Push('B',Whereat); putc(' ',Temp); putc(Top(OpHolder),Temp); Pop(OpHolder); }
Push(holder,OpHolder);
== 3))
/******
Èç¹ûµ±Ç°ÔËËã·ûºÅµÄÓÅÏȼ¶Ð¡ÓÚ»òÕßµÈÓÚ¶ÑÕ»ÖеÄÔËËã·ûºÅµÄÓÅÏȼ¶,Ôò½«Æä·ÅÈëtempÖУ¬²¢ÇÒ½«¶ÑÕ»ÖеÄÔËËã·ûºÅ³öÕ»£¬·ÅÈëtempÖУ¬Ö±µ½¶ÑջΪ¿Õ»òÕßÓÅÏȼ¶Ð¡ÓÚ¶ÑÕ»¶¥ÔªËصÄÓÅÏȼ¶ ******/ else if(OperatorValue(Top(OpHolder)) >= OperatorValue(holder)){ while((IsEmpty(OpHolder) != 1) && (OperatorValue(Top(OpHolder)) >= OperatorValue(holder))
&& (OperatorValue(Top(OpHolder))!=6)) { putc(' ',Temp); putc(Top(OpHolder),Temp); Push('B',Whereat); Pop(OpHolder); } Push(holder,OpHolder); }
else if(OperatorValue(Top(OpHolder)) < OperatorValue(holder)){
/******
Èç¹ûµ±Ç°ÔËËã·ûºÅµÄÓÅÏȼ¶´óÓÚ¶ÑÕ»ÖеÄÔËËã·ûºÅµÄÓÅÏȼ¶,Ôò½«ÆäѹÈë¶ÑÕ»ÖÐ ******/ Push(holder,OpHolder); } } holder=getc(In);
} /* WhileÑ»·½áÊø*/ while(IsEmpty(OpHolder)!=1){ /******
×îºóÈç¹û¶ÑÕ»Öл¹ÓÐÔËËã·ûºÅ£¬ÔòÒ»²¢·Åµ½tempÖÐ ******/ Push('B',Whereat); putc(' ',Temp); putc(Top(OpHolder),Temp); Pop(OpHolder); }
MakeEmpty(OpHolder); free(OpHolder);
}
/******ÅжÏÀàÐÍ£¬1ΪÔËËã·ûºÅ£¬0Ϊ²Ù×÷Êý£¬-1Ϊ´íÎó******/ int IsOperator(char ToCompare) {
if (ToCompare == '(' || ToCompare == ')'|| ToCompare == '+' || ToCompare == '-' || ToCompare == '*'|| ToCompare == '/' || ToCompare == '^'|| ToCompare == '%') { return 1; }
else if (ToCompare == '1' || ToCompare == '2'|| ToCompare == '3' || ToCompare == '4' || ToCompare == '5'|| ToCompare == '6' || ToCompare == '7'|| ToCompare == '8' || ToCompare == '9' || ToCompare == '0'|| ToCompare == '.') { return 0; } else{ return -1; }