198 lines
8.7 KiB
C
198 lines
8.7 KiB
C
|
/*
|
|||
|
Program: evalExpression-v1.c (Report comments/bugs to chikh@yuntech.edu.tw)
|
|||
|
Function: <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>ѽd<EFBFBD><EFBFBD>infixTopostfix.c<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>P<EFBFBD>ĤT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD>ĥ|<EFBFBD>D<EFBFBD><EFBFBD><EFBFBD>n<EFBFBD>D<EFBFBD>A<EFBFBD>ϱo<EFBFBD>{<EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϥΪ<EFBFBD>
|
|||
|
<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>L<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>H<EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>ܹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>A<EFBFBD>A<EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD>G<EFBFBD>ȡC
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>Q<EFBFBD><EFBFBD><EFBFBD>@<EFBFBD>D<EFBFBD>ȵ{<EFBFBD>ǡA<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>P<EFBFBD>B<EFBFBD>⤸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[<EFBFBD>J<EFBFBD>Ů<EFBFBD><EFBFBD>j<EFBFBD>}<EFBFBD>A<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܻP<EFBFBD>r<EFBFBD>ꤺ<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>ܤG<EFBFBD>Ӫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>G<EFBFBD>̴X<EFBFBD>G<EFBFBD>ۦP<EFBFBD>A<EFBFBD><EFBFBD>+-<EFBFBD>Ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD>@<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>γ~<EFBFBD>ɡA<EFBFBD>r<EFBFBD>ꤺ<EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><EFBFBD><EFBFBD>H@_<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD>]<EFBFBD>p<EFBFBD>N<EFBFBD><EFBFBD><EFBFBD>U<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD>u<EFBFBD>X<EFBFBD>@<EFBFBD>ӹB<EFBFBD>⤸<EFBFBD>μu<EFBFBD>X<EFBFBD>G<EFBFBD>ӹB<EFBFBD>⤸<EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>
|
|||
|
Notes: <EFBFBD><EFBFBD><EFBFBD>թҥο<EFBFBD><EFBFBD>J<EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>G
|
|||
|
10+20*(50-30)/2^4-6*8
|
|||
|
10+20*(-50+30)/-2^4-6*8
|
|||
|
10.5+20.8*(50.1-30.6)/2.5^4-6.6*8.2
|
|||
|
10.5+20.8*(-50.1+30.6)/2.5^-4-6.6*8.2
|
|||
|
10-30*(+50-20)/-2^-4+7.5*-6
|
|||
|
10+30*(+50.2+3.8)/+2^2.5+15*-6.5
|
|||
|
1+(3*(50.2-3.8)/2^2.5)/12+15*6.5
|
|||
|
1+(3*(-50.2+3.8)*2^-2.5)/12+15*-6.5
|
|||
|
*/
|
|||
|
|
|||
|
#include <stdio.h> /* for scanf(), printf(), sscanf(), sprintf() */
|
|||
|
#include <math.h> /* for pow() */
|
|||
|
#include <ctype.h> /* for isdigit() */
|
|||
|
|
|||
|
#define MAX 120
|
|||
|
|
|||
|
void infix_to_postfix(char [], int, char []); /* <20>Ѥ<EFBFBD><D1A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
int compare(char, char); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӹB<D3B9><42><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD> */
|
|||
|
float evaluate(char []); /* <20>s<EFBFBD>q<EFBFBD><71><EFBFBD>ơA<C6A1><41><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD>@<40>һݪ<D2BB><DDAA>ƾǹB<C7B9><42><EFBFBD>æ^<5E>ǵ<EFBFBD><C7B5>G<EFBFBD><47> */
|
|||
|
|
|||
|
/* <20>b<EFBFBD><62><EFBFBD>Ǫ<EFBFBD><C7AA>ܪk<DCAA><6B><EFBFBD>C<EFBFBD>μȦs<C8A6><73><EFBFBD>|<7C><><EFBFBD>A<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD>u<EFBFBD><75><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><C7AA>A<EFBFBD><41><EFBFBD>u<EFBFBD><75><EFBFBD>Ȭ<EFBFBD>INDEX/2 */
|
|||
|
char infix_priority[9] = {'#', ')', '+', '-', '*', '/', '^', '('};
|
|||
|
char stack_priority[8] = {'#', '(', '+', '-', '*', '/', '^'};
|
|||
|
|
|||
|
int main()
|
|||
|
{
|
|||
|
int i, index = -1;
|
|||
|
char infix_q[MAX], postExpr[2*MAX] = {0}; /* <20>x<EFBFBD>s<EFBFBD>ϥΪ̿<CEAA><CCBF>J<EFBFBD><4A><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>ഫ<EFBFBD><E0B4AB><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD>s<EFBFBD><73>postExpr */
|
|||
|
|
|||
|
printf("\n<EFBFBD>п<EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD>(<28>䴩+-*/^()<29>B<EFBFBD><42>) => ");
|
|||
|
|
|||
|
while (infix_q[index] != '\n')
|
|||
|
infix_q[++index] = getchar();
|
|||
|
infix_q[index] = '#'; /* <20><><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>̫<EFBFBD><CCAB>@<40>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD>N<EFBFBD><4E>'#'<27>A<EFBFBD>@<40><><EFBFBD>B<EFBFBD>⦡<EFBFBD>r<EFBFBD>굲<EFBFBD><EAB5B2> */
|
|||
|
|
|||
|
printf("\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǫ<EFBFBD><EFBFBD>ܦ<EFBFBD><EFBFBD>G");
|
|||
|
infix_to_postfix(infix_q,index,postExpr); /* <20><><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD>ơA<C6A1>ഫ<EFBFBD><E0B4AB><EFBFBD>G<EFBFBD>s<EFBFBD><73>postExpr */
|
|||
|
printf("\n<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҥΪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><EFBFBD>G%s",postExpr); /* <20><>postExpr<70><72><EFBFBD>X<EFBFBD>A<EFBFBD>˵<EFBFBD><CBB5>ĪG<C4AA>t<EFBFBD><74> */
|
|||
|
printf("\n\n<EFBFBD>B<EFBFBD><EFBFBD>G=%g",evaluate(postExpr));
|
|||
|
printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+20*(50-30)/pow(2,4)-6*8);
|
|||
|
printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+20*(-50+30)/pow(-2,4)-6*8);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10.5+20.8*(50.1-30.6)/pow(2.5,4)-6.6*8.2);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10.5+20.8*(-50.1+30.6)/pow(2.5,-4)-6.6*8.2);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10-30*(+50-20)/pow(-2,-4)+7.5*-6);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",10+30*(+50.2+3.8)/pow(2,2.5)+15*-6.5);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",1+(3*(50.2-3.8)/pow(2,2.5))/12+15*6.5);
|
|||
|
//printf("\t(<28><><EFBFBD>T<EFBFBD><54>=%g)\n\n",1+(3*(-50.2+3.8)*pow(2,-2.5))/12+15*-6.5);
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
void infix_to_postfix(char infix_q[], int index, char postExpr[]) /* <20><><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD>ơA<C6A1>ഫ<EFBFBD><E0B4AB><EFBFBD>G<EFBFBD>s<EFBFBD><73>postExpr<70>r<EFBFBD><72> */
|
|||
|
{
|
|||
|
int top = 0, ctr, tag = 1, i = 0;
|
|||
|
char c, stack_t[MAX]; /* <20>x<EFBFBD>s<EFBFBD>٤<EFBFBD><D9A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>B<EFBFBD><42><EFBFBD>l */
|
|||
|
|
|||
|
stack_t[top] = '#'; /* <20><><EFBFBD><EFBFBD><EFBFBD>|<7C>̩<EFBFBD><CCA9>U<EFBFBD>[<5B>J#<23><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ÿ<EFBFBD> */
|
|||
|
for (ctr = 0; ctr <= index; ctr++) { /* <20>B<EFBFBD>⦡<EFBFBD><E2A6A1><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>q<EFBFBD><71>0<EFBFBD>r<EFBFBD><72><EFBFBD>}<7D>l<EFBFBD>A<EFBFBD>v<EFBFBD>r<EFBFBD><72><EFBFBD>y<EFBFBD>A<EFBFBD><41><EFBFBD>̫ܳ<DCB3><CCAB>@<40>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
switch (infix_q[ctr]) { /* <20>˵<EFBFBD>ctr<74><72><EFBFBD>ޭȹ<DEAD><C8B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>e<EFBFBD>A<EFBFBD>d<EFBFBD>ݬO<DDAC>_<EFBFBD>k<EFBFBD>X<EFBFBD><58><EFBFBD>U<EFBFBD><55><EFBFBD>@<40><><EFBFBD>p */
|
|||
|
case ')': /* <20><><EFBFBD>J<EFBFBD><4A>')'<27>A<EFBFBD>N<EFBFBD><4E><EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>u<EFBFBD>X'('<27><><EFBFBD><EFBFBD> */
|
|||
|
printf(" "); /* <20>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>ܥ[<5B>J<EFBFBD>ťն<C5A5><D5B6>j */
|
|||
|
sprintf(postExpr,"%s ",postExpr); /* <20>{<7B><>postExpr<70><72><EFBFBD>ݥ[<5B>@<40>ť<EFBFBD> */
|
|||
|
while (stack_t[top] != '(') {
|
|||
|
printf("%c ",c=stack_t[top--]); /* <20>u<EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>ݪ<EFBFBD><DDAA>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD>s<EFBFBD>Jc<4A><63><EFBFBD><EFBFBD><EFBFBD>ܩ<EFBFBD><DCA9>ù<EFBFBD> */
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c); /* <20><>c<EFBFBD>[<5B>JpostExpr<70><72><EFBFBD>å[<5B>@<40>ť<EFBFBD> */
|
|||
|
}
|
|||
|
top--; /* <20><>'('<27>@<40>ֲ<EFBFBD><D6B2><EFBFBD> */
|
|||
|
break;
|
|||
|
|
|||
|
case '#': /* <20><><EFBFBD>J<EFBFBD><4A>#<23>A<EFBFBD>N<EFBFBD><4E><EFBFBD>w<EFBFBD><77><EFBFBD>y<EFBFBD><79><EFBFBD>̥<EFBFBD><CCA5>r<EFBFBD><72><EFBFBD>A<EFBFBD><41><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>|<7C><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>q<EFBFBD>q<EFBFBD>u<EFBFBD>X */
|
|||
|
printf(" "); /* <20>ù<EFBFBD><C3B9><EFBFBD><EFBFBD>ܥ[<5B>J<EFBFBD>ťն<C5A5><D5B6>j */
|
|||
|
sprintf(postExpr,"%s ",postExpr); /* postExpr<70><72><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>[<5B>@<40>ť<EFBFBD> */
|
|||
|
while (stack_t[top] != '#') {
|
|||
|
printf("%c ",c=stack_t[top--]); /* <20>j<EFBFBD>餺<EFBFBD>o<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><DEBF>P<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD>73<37>B74<37><34><EFBFBD>ۦP */
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
/* <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD>Y<EFBFBD><59><EFBFBD>u<EFBFBD><75><EFBFBD>v<=<3D><><EFBFBD>|<7C><><EFBFBD>ݪ<EFBFBD><DDAA>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>B
|
|||
|
<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>p<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD>u<EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>F
|
|||
|
<EFBFBD>Y<EFBFBD><EFBFBD><EFBFBD>y<EFBFBD>쪺<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD><EFBFBD><EFBFBD>ݪ<EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>A<EFBFBD>h<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><EFBFBD><EFBFBD>| */
|
|||
|
case '(':
|
|||
|
case '^':
|
|||
|
case '*':
|
|||
|
case '/':
|
|||
|
printf(" ");
|
|||
|
sprintf(postExpr,"%s ",postExpr);
|
|||
|
while (compare(stack_t[top],infix_q[ctr])) { /* <20><><EFBFBD>|<7C><><EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD><76><EFBFBD>j<EFBFBD><6A><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>q<EFBFBD>q<EFBFBD>u<EFBFBD>X<EFBFBD><58> */
|
|||
|
printf("%c ",c=stack_t[top--]); /* <20>j<EFBFBD>餺<EFBFBD>o<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><DEBF>P<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD>73<37>B74<37><34><EFBFBD>ۦP */
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
stack_t[++top] = infix_q[ctr]; /* <20>s<EFBFBD><73><EFBFBD>y<EFBFBD>쪺<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD>J<EFBFBD><4A><EFBFBD>| */
|
|||
|
tag = 1;
|
|||
|
break;
|
|||
|
case '+':
|
|||
|
case '-':
|
|||
|
if (tag == 1) { /* <20>P<EFBFBD>_ '(' '^' '*' '/' <20>᪺ +- <20><><EFBFBD>O<EFBFBD>_<EFBFBD>@<40>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>γ~ */
|
|||
|
stack_t[++top] = infix_q[ctr]; /* <20>Y<EFBFBD><59><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>γ~<7E>A<EFBFBD><41><EFBFBD><EFBFBD>+-<2D><><EFBFBD><EFBFBD><EFBFBD>J<EFBFBD><4A><EFBFBD>| */
|
|||
|
tag = 2; /* tag<61><67><EFBFBD>]<5D><>2<EFBFBD>A<EFBFBD>Хܬ<D0A5><DCAC>S<EFBFBD><53><EFBFBD><EFBFBD><EFBFBD>p<EFBFBD>A<EFBFBD>N<EFBFBD>ϱo<CFB1>۪<F2B1B5B5><DBAA>B<EFBFBD>⤸<EFBFBD><E2A4B8><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>H<EFBFBD>Y<EFBFBD><59>+-<2D><><EFBFBD>u<EFBFBD>X */
|
|||
|
}
|
|||
|
else { /* <20>u<EFBFBD>ntag<61><67><EFBFBD><EFBFBD>1<EFBFBD>A<EFBFBD>h<EFBFBD>i<EFBFBD><69><EFBFBD>@<40>몺<EFBFBD>B<EFBFBD>z<EFBFBD>覡<EFBFBD>C<EFBFBD>]+-<2D>B<EFBFBD>⪺<EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD><76><EFBFBD>C<EFBFBD>A<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>|<7C><><EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>u<EFBFBD>X */
|
|||
|
printf(" ");
|
|||
|
sprintf(postExpr,"%s ",postExpr);
|
|||
|
while (compare(stack_t[top],infix_q[ctr])) {
|
|||
|
printf("%c ",c=stack_t[top--]); /* <20>j<EFBFBD>餺<EFBFBD>o<EFBFBD>G<EFBFBD><47><EFBFBD><EFBFBD><EFBFBD>O<EFBFBD><4F><EFBFBD><EFBFBD><DEBF>P<EFBFBD>W<EFBFBD><57><EFBFBD><EFBFBD>73<37>B74<37><34><EFBFBD>ۦP */
|
|||
|
sprintf(postExpr,"%s%c ",postExpr,c);
|
|||
|
}
|
|||
|
stack_t[++top] = infix_q[ctr];
|
|||
|
tag = 1;
|
|||
|
}
|
|||
|
break;
|
|||
|
|
|||
|
case ' ': /* <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>Ǧ<EFBFBD><C7A6><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD>Y<EFBFBD><59><EFBFBD>Ů<EFBFBD><C5AE>A<EFBFBD>h<EFBFBD><68><EFBFBD>L<EFBFBD>Ӧr<D3A6><72> */
|
|||
|
break; /* do nothing<6E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L */
|
|||
|
|
|||
|
default: /* <20><><EFBFBD>J<EFBFBD>r<EFBFBD><72><EFBFBD>P<EFBFBD>H<EFBFBD>W<EFBFBD><57><EFBFBD>p<EFBFBD><70><EFBFBD>šA<C5A1>h<EFBFBD><68><EFBFBD>B<EFBFBD>⤸<EFBFBD>A<EFBFBD>i<EFBFBD><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X */
|
|||
|
for (i = 0; isdigit(infix_q[ctr+i]) || infix_q[ctr+i]=='.'; i++) { /* <20>j<EFBFBD><6A><EFBFBD>^<5E><><EFBFBD>s<EFBFBD>r<F2AABAA6><72><EFBFBD>@<40><><EFBFBD>B<EFBFBD>⤸<EFBFBD>A<EFBFBD>i<EFBFBD><69><EFBFBD>O<EFBFBD><4F><EFBFBD>Ʃαa<CEB1>p<EFBFBD><70><EFBFBD>I<EFBFBD><49><EFBFBD>B<EFBFBD>I<EFBFBD><49> */
|
|||
|
printf("%c",c=infix_q[ctr+i]); /* <20>Hctr<74><72><EFBFBD>}<7D>l<EFBFBD><6C><EFBFBD>m<EFBFBD>A+i<>M<EFBFBD>w<EFBFBD>U<EFBFBD>@<40>Ӹ<EFBFBD>Ū<EFBFBD><C5AA><EFBFBD><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>m<EFBFBD>A<EFBFBD><41><EFBFBD>Ӧr<D3A6><72>Ū<EFBFBD>X<EFBFBD>s<EFBFBD>Jc<4A><63><EFBFBD><EFBFBD><EFBFBD>ܩ<EFBFBD><DCA9>ù<EFBFBD> */
|
|||
|
sprintf(postExpr,"%s%c",postExpr,c);/* <20><>c<EFBFBD>[<5B>JpostExpr<70><72><EFBFBD>A<EFBFBD>`<60>N<EFBFBD><4E><EFBFBD>[<5B>ťն<C5A5><D5B6>j */
|
|||
|
}
|
|||
|
ctr += (i-1); /* <20>B<EFBFBD>⤸<EFBFBD>w<EFBFBD>B<EFBFBD>z<EFBFBD><7A><EFBFBD>A<EFBFBD>վ<EFBFBD>ctr<74>ܹB<DCB9>⤸<EFBFBD><E2A4B8><EFBFBD>᪺<EFBFBD>U<EFBFBD>@<40>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD>m */
|
|||
|
if (tag == 2) { /* tag<61>]<5D><>2<EFBFBD>A<EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD>+-<2D>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD>@<40><><EFBFBD>γ~<7E>A<EFBFBD><41><EFBFBD>O<EFBFBD><4F><EFBFBD>s<EFBFBD><73><EFBFBD>b<EFBFBD><62><EFBFBD>|<7C><>+-<2D>Ÿ<EFBFBD><C5B8><EFBFBD><EFBFBD>X */
|
|||
|
printf(" %c ",c=stack_t[top--]); /* <20>u<EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>ݪ<EFBFBD><DDAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD>s<EFBFBD><73>c<EFBFBD><63><EFBFBD><EFBFBD><EFBFBD>ܩ<EFBFBD><DCA9>ù<EFBFBD> */
|
|||
|
sprintf(postExpr,"%s %c ",postExpr,c=='-'?'_':'@'); /* <20>o<EFBFBD>̭A<CCAD><41><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD>˵<EFBFBD>c<EFBFBD>O<EFBFBD>_<EFBFBD><5F>-<2D><><EFBFBD>A<EFBFBD>Y<EFBFBD>O<EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>]'_'<27><>postExpr<70><72><EFBFBD><EFBFBD><EFBFBD>ݡA<DDA1>_<EFBFBD>h<EFBFBD><68>'@'<27>]<5D>J<EFBFBD><4A><EFBFBD>Ǧ<EFBFBD> */
|
|||
|
}
|
|||
|
tag = 0; /* <20>@<40><><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>L<EFBFBD>B<EFBFBD>⤸<EFBFBD>Atag<61>Y<EFBFBD>k0<6B>A<EFBFBD>Ѱ<EFBFBD>+-<2D><><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD><6C><EFBFBD><EFBFBD><EFBFBD>A */
|
|||
|
break;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>u<EFBFBD><75><EFBFBD>v<EFBFBD>A<EFBFBD>Y<EFBFBD><59><EFBFBD>J<EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>p<EFBFBD><EFBFBD><F3B5A5A9><EFBFBD><EFBFBD>|<7C><><EFBFBD>B<EFBFBD><42><EFBFBD>l<EFBFBD>A<EFBFBD>h<EFBFBD>Ǧ^<5E>Ȭ<EFBFBD> 1<>A<EFBFBD>_<EFBFBD>h<EFBFBD><68> 0 */
|
|||
|
int compare(char stack_o, char infix_o)
|
|||
|
{
|
|||
|
int index_s = 0, index_i = 0;
|
|||
|
while (stack_priority[index_s] != stack_o)
|
|||
|
index_s++;
|
|||
|
while (infix_priority[index_i] != infix_o)
|
|||
|
index_i++;
|
|||
|
return index_s/2 >= index_i/2 ? 1 : 0;
|
|||
|
}
|
|||
|
|
|||
|
float evaluate(char *str) /* <20>̿<EFBFBD><CCBF>J<EFBFBD><4A><EFBFBD><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72><EFBFBD>A<EFBFBD>i<EFBFBD><69><EFBFBD>B<EFBFBD><42><EFBFBD>D<EFBFBD><44> */
|
|||
|
{
|
|||
|
char token[16];
|
|||
|
float stack[MAX], operand, a, b, t; /* stack[]<5D><><EFBFBD>t<EFBFBD>@<40>Ӱ<EFBFBD><D3B0>|<7C>A<EFBFBD>D<EFBFBD>ȹB<C8B9><42><EFBFBD>L<EFBFBD>{<7B><><EFBFBD>Ȧs<C8A6>B<EFBFBD>⤸<EFBFBD><E2A4B8><EFBFBD><EFBFBD> */
|
|||
|
int top = -1;
|
|||
|
|
|||
|
for (; *str; str++) { /* <20>H<EFBFBD>j<EFBFBD><6A><EFBFBD>v<EFBFBD>@<40>˵<EFBFBD>str<74><72><EFBFBD>Ҧ<EFBFBD><D2A6>r<EFBFBD><72><EFBFBD>A<EFBFBD>u<EFBFBD>n<EFBFBD>ثe<D8AB>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>'\0'<27>A<EFBFBD>h<EFBFBD><68><EFBFBD>橳<EFBFBD>U<EFBFBD>ʧ@ */
|
|||
|
if (*str == ' ') /* <20>Y<EFBFBD><59><EFBFBD>ťզr<D5A6><72><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD>L */
|
|||
|
continue;
|
|||
|
else if (isdigit(*str)) { /* <20>Y<EFBFBD><59><EFBFBD>U<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>Ʀr<C6A6>A<EFBFBD>N<EFBFBD><4E><EFBFBD>s<F2B1B5B3><73><EFBFBD>X<EFBFBD>Ӧr<D3A6><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40>ӹB<D3B9>⤸ */
|
|||
|
sscanf(str,"%f%1000[^\n]",&operand,str); /* <20><><EFBFBD>FŪ<46><C5AA><EFBFBD><EFBFBD><EFBFBD>㪺<EFBFBD>B<EFBFBD>⤸<EFBFBD>A<EFBFBD>H<EFBFBD><48><EFBFBD>I<EFBFBD>ƪ<EFBFBD><C6AA>榡Ū<E6A6A1>Joperand<6E>A<EFBFBD>Ѿl<D1BE><6C><EFBFBD>r<EFBFBD><72><EFBFBD>A<EFBFBD>]<5D><>str */
|
|||
|
stack[++top] = operand; /* <20>B<EFBFBD>⤸operand<6E><64><EFBFBD>J<EFBFBD><4A><EFBFBD>| */
|
|||
|
}
|
|||
|
else { /* <20><><EFBFBD>U<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>r<EFBFBD><72><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD>l */
|
|||
|
b = stack[top--]; /* stack<63>u<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>̷s<CCB7><73><EFBFBD>J<EFBFBD><4A><EFBFBD>B<EFBFBD>⤸ */
|
|||
|
a = stack[top--]; /* stack<63>u<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD>s<EFBFBD>B<EFBFBD>⤸ */
|
|||
|
switch (*str) { /* <20>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>U<EFBFBD>r<EFBFBD><72><EFBFBD>N<EFBFBD><4E><EFBFBD><EFBFBD><EFBFBD>@<40>عB<D8B9><42> */
|
|||
|
case '+':
|
|||
|
t = a+b; /* <20>[<5B>k<EFBFBD>B<EFBFBD><EFBFBD>G<EFBFBD>]<5D><>t */
|
|||
|
break;
|
|||
|
case '-':
|
|||
|
t = a-b; /* <20><><EFBFBD>k<EFBFBD>B<EFBFBD><EFBFBD>G<EFBFBD>]<5D><>t */
|
|||
|
break;
|
|||
|
case '@':
|
|||
|
stack[++top] = a; /* <20>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1>^<5E><><EFBFBD>|<7C>A<EFBFBD>]<5D><><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>A<EFBFBD>`<60>N<EFBFBD><4E><EFBFBD><EFBFBD>a(<28>ӫDb)<29><><EFBFBD>^<5E><><EFBFBD>| */
|
|||
|
t = b;
|
|||
|
break;
|
|||
|
case '_':
|
|||
|
stack[++top] = a; /* <20>h<EFBFBD><68><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD><EFBFBD>Ʊ<EFBFBD><C6B1>^<5E><><EFBFBD>|<7C>A<EFBFBD>]<5D><><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42> */
|
|||
|
t = -b; /* negate b */
|
|||
|
break;
|
|||
|
case '*':
|
|||
|
t = a*b; /* <20><><EFBFBD>k<EFBFBD>B<EFBFBD><EFBFBD>G<EFBFBD>]<5D><>t */
|
|||
|
break;
|
|||
|
case '/':
|
|||
|
t = (float)a/b; /* <20><><EFBFBD>k<EFBFBD>B<EFBFBD><EFBFBD>G<EFBFBD>]<5D><>t */
|
|||
|
break;
|
|||
|
case '^':
|
|||
|
t = (float)pow(a,b); /* <20><><EFBFBD>ƹB<C6B9><EFBFBD>G<EFBFBD>]<5D><>t */
|
|||
|
break;
|
|||
|
}
|
|||
|
stack[++top] = t; /* <20>s<EFBFBD>o<EFBFBD>쪺t<ECAABA>ȱ<EFBFBD><C8B1>J<EFBFBD><4A><EFBFBD>| */
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return stack[top]; /* <20><><EFBFBD>ӵ{<7B>ǧ<EFBFBD><C7A7><EFBFBD><EFBFBD>A<EFBFBD><41><EFBFBD>|<7C><><EFBFBD>ݫO<DDAB><4F><EFBFBD>B<EFBFBD><42><EFBFBD>̲<CCB2><D7B5>G<EFBFBD><47> */
|
|||
|
}
|