33,006
社区成员
发帖
与我相关
我的任务
分享
#include "栈.c" //这个肯定没有问题
int In(char c) // 判断是不是运算符
{
switch(c)
{
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
case '\n': return 1;
default : return 0;
}
}
char Precede(char e,char c)
{
char t;
switch(e)
{
case '+':
case '-': if(c=='+' || c== '-' || c==')' || c== '#')
t = '>';
else t='<';
break;
case '*':
case '/': if(c=='(') t='<';
else t= '>';
break;
case '(': if(c==')') t='=';
else t='<';
break;
case ')': if(c=='(') t=0;
else t= '>';
break;
case '#': if(c=='#') t='=';
else t= '<';
break;
default: printf("error!");
}
return t;
}
char Operate(char a,char b,char op)
{
a-='0';
b-='0';
switch (op)
{
case '+': return a+b;
break;
case '-': return a-b;
break;
case '*': return a*b;
break;
case '/':return a/b;
}
}
double EvaluateExpression()
{
FILE *fp;
char c,e,x,theta,a,b; //c当前字符,e栈顶元素
SqStack optr,opnd;//optr寄存运算符。opnd寄存操作数或运算结果
fp=fopen("表达式求值.txt","r");
if(!fp) {
printf("file open error!\n");
exit(0);}
InitStack(&optr);
Push(&optr,'#');
InitStack(&opnd);
c=fgetc(fp);
while(c!='#' || (e=getTop(optr,e))!='#')
{
if(!In(c))//如果不是运算符进栈
{
Push(&opnd,c);
c=fgetc(fp);
}
else switch(Precede(e=getTop(optr,e),c)) //运算符和栈顶元素比较优先级
{
case '<': Push(&optr,c);
c=fgetc(fp);
break;
case '=': x=Pop(&optr,x);
c=fgetc(fp);
break;
case '>': theta=Pop(&optr,theta);
a=Pop(&opnd,a);
b=Pop(&opnd,b);
Push(&opnd,Operate(a,b,theta));//运算结果进栈
break;
}
}
return e=getTop(opnd,e);
}
main()
{
printf("请输入表达式:\t");
printf("表达式的值为: %f",EvaluateExpression());
}