表达式求值....搞不出来了,

javadream11 2009-04-11 09:10:30

#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());
}
...全文
124 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
woxiaoe 2009-04-12
  • 打赏
  • 举报
回复
很好很强大
ToBeTough 2009-04-12
  • 打赏
  • 举报
回复
帮顶 !
forcal 2009-04-12
  • 打赏
  • 举报
回复
要完整实现算术表达式求值要耗费较大精力的。
向楼主推荐直接使用forcal。
我的blog:http://blog.csdn.net/forcal
在该站点下载:http://www.skycn.com/soft/23045.html
同时参考:http://www.skycn.com/soft/50559.html
同时参考:http://www.skycn.com/soft/14414.html
bambookudo 2009-04-12
  • 打赏
  • 举报
回复
int In(char c) // 判断是不是运算符中没有BREAK。。。
另外。。。出了什么问题?有问题才有解决方案。。。。
bambookudo 2009-04-12
  • 打赏
  • 举报
回复
int In(char c) // 判断是不是运算符中没有BREAK。。。
另外。。。出了什么问题?有问题才有解决方案。。。。

33,006

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧