Data_Structure/作業/老師解答/unit3/evalExpression-v2.c

189 lines
6.2 KiB
C
Raw Normal View History

2025-01-20 21:25:33 +08:00
/*
Program: evalExpression-v2.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>̦<EFBFBD><EFBFBD>i<EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܵ<EFBFBD><EFBFBD>G<EFBFBD>ȡC
<EFBFBD>PevalExpression-v1.c<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD>ۦP<EFBFBD>A<EFBFBD>ߤ@<EFBFBD>t<EFBFBD><EFBFBD><EFBFBD>bevaluate()<EFBFBD><EFBFBD><EFBFBD>ƪ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<EFBFBD><EFBFBD>F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Hstrtok()
<EFBFBD>@<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>A<EFBFBD>H<EFBFBD>ťէ@<EFBFBD><EFBFBD><EFBFBD>j<EFBFBD>r<EFBFBD><EFBFBD><EFBFBD>A<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD>һݪ<EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>P<EFBFBD>B<EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>C
Notes:
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
*/
#include <stdio.h>
#include <string.h> /* for strtok() */
#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><C7A8><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><EFBFBD><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);
//printf("\n --> %s\n",postExpr);
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);
return 0;
}
void infix_to_postfix(char infix_q[], int index, char postExpr[])
{
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);
while (stack_t[top] != '(') {
printf("%c ",c=stack_t[top--]);
sprintf(postExpr,"%s%c ",postExpr,c);
}
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(" ");
sprintf(postExpr,"%s ",postExpr); /* <20>ɤJ<C9A4>ťթ<C5A5><D5A9><EFBFBD><EFBFBD>Ǧ<EFBFBD><C7A6>r<EFBFBD><72> */
while (stack_t[top] != '#') {
printf("%c ",c=stack_t[top--]);
sprintf(postExpr,"%s%c ",postExpr,c);
}
break;
case '(':
case '^':
case '*':
case '/':
printf(" ");
sprintf(postExpr,"%s ",postExpr);
while (compare(stack_t[top],infix_q[ctr])) {
printf("%c ",c=stack_t[top--]);
sprintf(postExpr,"%s%c ",postExpr,c);
}
stack_t[++top] = infix_q[ctr];
tag = 1;
break;
case '+':
case '-':
if (tag == 1) { /* <20>P<EFBFBD>_ '(' '^' '*' '/' <20>᪺ +- <20><><EFBFBD>O<EFBFBD>_<EFBFBD><5F><EFBFBD>ܥ<EFBFBD><DCA5>t<EFBFBD><74><EFBFBD>@<40><><EFBFBD>B<EFBFBD><42><EFBFBD>l */
stack_t[++top] = infix_q[ctr];
tag = 2;
}
else {
printf(" ");
sprintf(postExpr,"%s ",postExpr);
while (compare(stack_t[top],infix_q[ctr])) {
printf("%c ",c=stack_t[top--]);
sprintf(postExpr,"%s%c ",postExpr,c);
}
stack_t[++top] = infix_q[ctr];
tag = 1;
}
break;
case ' ':
break; /* do nothing<6E>A<EFBFBD><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>L */
/* <20><><EFBFBD>J<EFBFBD><4A><EFBFBD>B<EFBFBD><EFBFBD>A<EFBFBD>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X */
default:
for (i = 0; isdigit(infix_q[ctr+i]) || infix_q[ctr+i]=='.'; i++) {
printf("%c",c=infix_q[ctr+i]);
sprintf(postExpr,"%s%c",postExpr,c);
}
ctr += (i-1);
if (tag == 2) { /* <20>N<EFBFBD>s<EFBFBD><73><EFBFBD>b<EFBFBD><62><EFBFBD>|<7C><><EFBFBD>t<EFBFBD><74><EFBFBD><EFBFBD><EFBFBD>X */
printf(" %c ",c=stack_t[top--]); /* <20><><EFBFBD>P<EFBFBD>u<EFBFBD>X<EFBFBD><58><EFBFBD>|<7C><><EFBFBD>ݪ<EFBFBD><DDAA><EFBFBD><EFBFBD><EFBFBD> */
sprintf(postExpr,"%s %c ",postExpr,c=='-'?'_':'@');
}
tag = 0;
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 expr[])
{
char *token;
float stack[MAX], a, b, c;
int top = -1;
token = strtok(expr," "); /* <20><><EFBFBD>o<EFBFBD>Ĥ@<40>ӲŰO */
while (token != NULL) { /* <20>Y<EFBFBD><59><EFBFBD><EFBFBD><EFBFBD>šA<C5A1>h<EFBFBD><68><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD><EFBFBD>R<EFBFBD>r<EFBFBD><72> */
if (atof(token)!=0.0)
stack[++top] = atof(token);
else {
b = stack[top--];
a = stack[top--];
switch(token[0]) {
case '+':
c = a+b;
break;
case '-':
c = a-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> */
c = 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> */
c = -b;
break;
case '*':
c = a*b;
break;
case '/':
c = (float)a/b;
break;
case '^':
c = (float)pow(a,b);
break;
}
stack[++top] = c;
}
token = strtok(NULL," "); /* <20>ܯS<DCAF>O<EFBFBD><4F><EFBFBD>g<EFBFBD>k<EFBFBD>A<EFBFBD>ЦP<D0A6>Ǧh<C7A6>[<5B>d<EFBFBD>N */
}
return stack[top];
}