#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='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; }