中缀表达式求值,正常输入一个表达式即可,不需要以#做结尾标记。
如:2+5*7-7^2
#include<stdlib.h>
#include <stdio.h>
#include<string.h>
#include <math.h>
#define Nul 0x00
char chinput[200], *p; /* 运算式存储字符串 */
/* 运算式当前读取位置 */
struct t /* 符号栈 */
{ char dat[200];
int top;
}prt;
struct d /* 数字栈 */
{ long int dat[200];
int top;
}prd;
char PRI[9][9]= /* 优先级表 */
{ {'>','>','<','<','<','<','<','>','>'},
{'>','>','<','<','<','<','<','>','>'},
{'>','>','>','>','<','<','<','>','>'},
{'>','>','>','>','<','<','<','>','>'},
{'>','>','>','>','>','<','<','>','>'},
{'>','>','>','>','>','<','<','>','>'},
{'<','<','<','<','<','<','<','=',Nul},
{'>','>','>','>','>','>',Nul,'>','>'},
{'<','<','<','<','<','<','<',Nul,'='}
};
void pushd( long int a ) /* 数字入栈 */
{ prd.dat[ prd.top++ ]=a;
}
void pusht( char a ) /* 符号入栈 */
{ prt.dat[ prt.top++ ]=a;
}
long int popd( ) /* 数字出栈 */
{ return prd.dat[ --prd.top ];
}
char popt( ) /* 符号出栈 */
{ return prt.dat[ --prt.top ];
}
long int numble( ) /* 数字整理 */
{ long int b=0;
do
{ b = b*10 + *p -'0'; // 组成整数
p++;
}
while ( *p>='0' && *p<='9' ) ;
return b;
}
long operation( long int x, long int y, char a )
{ switch( a )
{ case '+': return x+y;
case '-': return x-y;
case '*': return x*y;
case '/': if ( y ) return x/y;
else { printf("Divide 0.\n");exit(0);}
case '%': return ((long int) fmod(x,y));
case '^': if (y>=0 ) return pow(x,y);
else return 0;
default: printf("Error No. 3\n");
exit(1);
}
}
int signswitch( char a ) /* 符号转换 */
{ switch( a )
{ case '+': return 0; case '-': return 1;
case '*': return 2; case '/': return 3;
case '%': return 4; case '^': return 5;
case '(': return 6; case ')': return 7;
case '#': return 8;
default: printf("Error No. 2\n"); exit(1);
}
}
char refusal ( char a,char b ) /* 判定优先级 */
{ return PRI[signswitch(a)][signswitch(b)];
}
int main( )
{ int i,j,k,l, flag=0; /* flag=0前一个符号不是) */
char b;
prt.dat[0] = '#';
prt.top = 1;
prd.top = 0;
printf("Enter Expression=");
scanf("%s", chinput); /* 接收运算式 */
strcat ( chinput, "#"); /* 在运算式结尾加#号 */
p = chinput;
while ( *p!='#' || prt.dat[prt.top-1]!='#' )
{ if ( *p>='0' && *p<='9')
{ j = numble(); /* 如果是数字进行整理并入栈 */
pushd( j );
}
else /* 如果是符号与栈顶的符号比较并运算 */
{ if ( flag==1 && *p=='(' )
{ printf("Error No.1:%s\n", p); exit(0);
}
else if ( *p==')') flag = 1;
else flag = 0;
switch ( refusal(prt.dat[prt.top-1], *p ) )
{ case '<': pusht ( *p++ ); break; /* 高则入栈 */
case '=': popt( ); /* 脱括号 */
p++; break;
case '>': b = popt(); /* 低则进行栈顶计算 */
k = popd(); /* 第二操作数出栈 */
l = popd(); /* 第一操作数出栈 */
k = operation(l,k,b); /* 计算 */
pushd(k); break; /* 计算结果入栈 */
case Nul: printf("Error No. 4:%s\n", p);
exit(1);
}
}
}
printf("%d\n",prd.dat[prd.top-1]); /* 输出 */
}