#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAXSIZE 100
#define OK 1
#define ERROR 0
#define TURE 1
#define FALSE 0
typedef double DataType;
typedef struct
{
DataType data[MAXSIZE];
int top;
} Sqstack;
int Initstack(Sqstack &S)
{
S.top=-1;
return OK;
}
int StackEmpty(Sqstack S)
{
return (S.top=-1?TURE:FALSE);
}
int StackFull(Sqstack S)
{
return (S.top==MAXSIZE-1?TURE:FALSE);
}
int Push(Sqstack &S,DataType e)
{
if(StackFull(S))
return ERROR;
S.top++;
S.data[S.top]=e;
return OK;
}
int Pop(Sqstack &S,DataType &e)
{
if(StackEmpty(S))
return ERROR;
e=S.data[S.top];
S.top--;
return OK;
}
float GetTop(Sqstack S)
{
DataType e;
if(StackEmpty(S))
return ERROR;
e=S.data[S.top];
return e;
}
char Precede (char a,char b)
{
char z;
if((b=='+')||(b=='-')||(b=='')||(b=='/')|| (b=='(')||(b==')') ||(b=='='))
switch (a)
{case '+':
case '-':
if((b=='')||(b=='/')||(b=='(')) z='<';
else z='>'; break;
case '*':
case '/':
if(b=='(') z='<';
else z='>';break;
case '(':
if(b=='=') z='E';
else if(b==')')z='=';
else z='<';
break;
case ')':
if(b=='(') z='E';
else z='>'; break;
case '=':
if(b=='=')z='=';
else if(b==')') z='E';
else z='<';break;
}
else z='E';
return(z);
}
int In(char ch)
{
int i,flag=0;
char op[7]={'+','-','*','/','(',')','='};
for (i=0;i<7;i++)
if(ch==op[i])
{
flag=1;
break;
}
return flag;
}
DataType Operate(DataType a,char theta,DataType b)
{ DataType z;
switch (theta)
{
case '+':z=a+b;break;
case '-':z=a-b;break;
case '':z=ab;break;
case '/':z=a/b;break;
}
return(z);
}
float CalculateExpression(char *expr)
{
Sqstack optr,opnd;
DataType a,b,theta,x,sum;
char *p;
int count;
Initstack(optr);
Push(optr, '=');
Initstack(opnd);
p=expr;
while(*p!='='||GetTop(optr)!='=')
{
if(!In(*p))
{
sum=0;
count=0;
while(*p>='0'&&*p<='9'||*p=='.')
{
if(*p!='.')
sum=sum*10+*p-'0';
if(*p=='.'||count>0)
count++;
p++;
}
if(count>0)
sum=sum/pow(10,count-1);
Push(opnd,sum);
}
else
switch(Precede(GetTop(optr),*p))
{ case '<' :
Push(optr,*p);
p++;
break;
case '=' :
Pop(optr,x);
p++;
break;
case '>':
Pop(optr,theta);
Pop(opnd,b);Pop(opnd,a);
Push(opnd,Operate(a,theta,b));
break;
case 'E':printf("表达式中括号不匹配!");
exit(1);
}
}
return GetTop(opnd);
}
int xj(char *expr)
{
char *p;
int flag=1;
p=expr;
while(*p!='\0')
p++;
p--;
if(*p!='=')
{
printf("表达式应以等号结束\n");
return 0;
}
p=expr;
while(*p!='\0')
{
if(*p>='0'&&*p<='9'||*p=='.'||In(*p))
{
p++;
}
else
{
printf("表达式中存在非法字符\n");
return 0;
}
}
return flag;
}
int main()
{
char str[81];
printf("Inpt an expression :");
scanf("%s",str);
if(xj(str))
{
printf("%s%f\n",str,CalculateExpression(str));
}
return 0;
}
(按下回车就没反应了)
(查错函数可以使用)