#include"stdlib.h"
typedef double DataType; /*数据存放类型*/
typedef int OpType; /*运算符存放类型*/
char *code = "+-*/()#"; /*运算符串*/
char priority[7][7] = {'>','>','<','<','<','>','>',
'>','>','<','<','<','>','>',
'>','>','>','>','<','>','>',
'>','>','>','>','<','>','>',
'<','<','<','<','<','=','>',
'>','>','>','>', 0 ,'>','>',
0 , 0 , 0 , 0 , 0 , 0 , 0 }; /*算符优先表*/
DataType Add(DataType a,DataType b) /*加*/
{
return a+b;
}
DataType Sub(DataType a,DataType b) /*减*/
{
return a-b;
}
DataType Mul(DataType a,DataType b) /*乘*/
{
return a*b;
}
DataType Div(DataType a,DataType b) /*除*/
{
return a/b;
}
DataType (*func[])(DataType,DataType)={Add,Sub,Mul,Div};
typedef struct
{
int top; /*数据栈*/
int max; /*最大长度*/
DataType *stack;
}datastack;
typedef struct
{
int top; /*运算符栈*/
int max; /*最大长度*/
OpType *stack;
}operastack;
int DataPush(datastack *s,DataType a) /*数据入栈*/
{
if(s->top == s->max)
return 0;
s->stack[s->top]=a;
s->top++;
return 1;
}
int DataPop(datastack *s,DataType *d) /*数据出栈*/
{
if(s->top == 0)
return 0;
s->top--;
*d = s->stack[s->top];
return 1;
}
int OperaPush(operastack *s,OpType a) /*运算符入栈*/
{
if(s->top == s->max)
return 0;
s->stack[s->top]=a;
s->top++;
return 1;
}
int OperaPop(datastack *s,OpType *op) /*运算符出栈*/
{
if(s->top == 0)
return 0;
s->top--;
*op = s->stack[s->top];
return 1;
}
datastack * CreateDataStack(int n) /*创建数据栈*/
{
datastack *data = (datastack *)malloc(sizeof(datastack));
if(!data)
return 0;
data->stack = (DataType *)malloc(sizeof(DataType)*n);
if(!data->stack)
{
free(data);
return 0;
}
data->top = 0;
data->max = n;
return data;
}
operastack * CreateOperaStack(int n) /* 创建运算符栈*/
{
operastack *opera = (operastack *)malloc(sizeof(operastack));
if(!opera)
return 0;
opera->stack = (OpType *)malloc(sizeof(OpType)*n);
if(!opera->stack)
{
free(opera);
return 0;
}
opera->top = 0;
opera->max = n;
return opera;
}
int account(char a[],DataType *result) /*表达式计算*/
{
int i,j = 0,f = 0,k = 0,n = 100;
char b[20]; /*用来记录数字串*/
DataType temp = 0,temp1 = 0,temp2 = 0; /*临时数据变量*/
operastack *opera;
datastack *data;
data = CreateDataStack(n);
if(!data)
return 0;
opera = CreateOperaStack(n);
if(!opera)
return 0;
for(i=0;i<strlen(a);i++)
{
if(a[i] == ' ') /*遇空格则不作处理,直接跳过*/
continue;
if(a[i]>='0'&&a[i]<='9'||a[i] == '.')
{
b[j++] = a[i];
f=1; /*表示有待入栈数据*/
}
else
{
if(f)
{
b[j] = 0;
j = 0;
if(!DataPush(data,atof(b))) /*数据入栈*/
{
printf("Expression error!\n");
return 0;
}
f=0;
}
for(k=0;a[i]!=code[k];k++); /*找出运算符在运算符字符串中的位置*/
if(opera->top == 0) /*运算符栈为空*/
{
if(k == strlen(code)-1) /*遇#,表达式结束*/ /*所有计算均已完成,返回结果*/
*result = data->stack[--(data->top)];
if(!OperaPush(opera,k)) /*运算符入栈*/
{
printf("Expression error!\n");
return 0;
}
}
else
{ /*对待入栈运算符与栈顶运算符进行优先级比较*/
if(priority[opera->stack[opera->top-1]][k] == '>') /*栈顶运算符优先级高,进行计算*/
{
while(1)
{
if(opera->stack[opera->top-1] == 5) /*出现右括号*/
{
opera->top--;
continue;
}
else if(opera->stack[opera->top-1] == 4) /*出现左括号*/
{
opera->top--;
i--; /*继续下一字符判断*/
break;
} /*计算,数据栈出栈栈顶两个数,运算符栈出栈一个运算符*/
if(!DataPop(data,&temp1))
{
printf("Expression error!\n");
return 0;
}
if(!DataPop(data,&temp2))
{
printf("Expression error!\n");
return 0;
}
temp = func[opera->stack[--(opera->top)]](temp2,temp1);
DataPush(data,temp); /*将计算结果入栈*/
i--; /*继续下一字符判断*/
break;
}
}
else /*栈顶运算符优先级低,新运算符入栈*/
OperaPush(opera,k);
}
}
}
return 1;
}