社区
C语言
帖子详情
关于表达式计算!
jacmy23
2007-08-30 08:35:01
表达式计算都有哪几种方法,除了表达式树?
考虑优先级,括号的表达式计算!
...全文
225
12
打赏
收藏
关于表达式计算!
表达式计算都有哪几种方法,除了表达式树? 考虑优先级,括号的表达式计算!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
a013231
2007-09-01
打赏
举报
回复
那谁能讲讲用栈大概怎么做?
-------------------------------------------------------------------------
先把中缀表达式化为后缀表达式.
然后读到数字就入栈,读到运算符就从栈中出两个数运算,运算结果入栈.
表达式读完后,栈中的数字就是答案了.
举例:
1+2*3
化为后缀形式1 2 3*+
1入栈,2入栈,3入栈
然后读到*号,2,3出栈做乘法,结果6入栈.
读到+号,1,6出栈做加法,结果7入栈.
表达式读完,栈中的7就是运算结果.
jacmy23
2007-09-01
打赏
举报
回复
那谁能讲讲用栈大概怎么做?
xugang_2001
2007-08-31
打赏
举报
回复
要的话速度阿 我快升小裤衩了 差1分。。。。。
xugang_2001
2007-08-31
打赏
举报
回复
我前几天项目刚好做了一个,我专门封装了一个类,带简单的错误检查,常用混合运算都可以用。你的Email给我,我直接发给你。
comman_ndsc
2007-08-31
打赏
举报
回复
用逆波兰表示法
jacmy23
2007-08-31
打赏
举报
回复
谁能大概看看上面的程序啊?
iambic
2007-08-31
打赏
举报
回复
1 口算
2 用计算器
3 写信问楼主
4 瞎猜
jacmy23
2007-08-31
打赏
举报
回复
我自己用表达式树做出来了,主要想知道上面的程序用的什么方法?
jacmy23
2007-08-30
打赏
举报
回复
上面那个少了个"{"
#include <stdio.h>
#include <string.h>
struct list
{
int index;
int a;
char b;
};
struct list s[100];
/*进堆比较*/
int comp1(char a,char b)
{
char op[4][2]={'*','/','+','-','(','(',')',')'};
int i;
int a1,b1;
for(i=0;i<4;i++)
if (a==op[i][0] || a==op[i][1])
{
a1=i;
break;
}
for(i=0;i<4;i++)
if (b==op[i][0] || b==op[i][1])
{
b1=i;
break;
}
if (a1<b1) return 1;
else return 0;
}
int comp2(char a,char b)
{
char op[4][2]={'(','(','*','/','+','-',')',')'};
int i;
int a1,b1;
for(i=0;i<4;i++)
if (a==op[i][0] || a==op[i][1])
{
a1=i;
break;
}
for(i=0;i<4;i++)
if (b==op[i][0] || b==op[i][1])
{
b1=i;
break;
}
if (a1<b1) return 1;
else return 0;
}
int oper(int a,int b,char op)
{
int result;
if(op=='*') result=a*b;
else if(op=='/') result=a/b;
else if(op=='+') result=a+b;
else if(op=='-') result=a-b;
return result;
}
int main()
{
int len=0,i=0,j;
int m,n,result;
char op;
int number=0;
char enter[100];
int s1[100],top1=0,top2=0;
char s2[100];
s2[top2]='(';top2++;
scanf("%s",enter); /*---------------------------------------------------------------------------------*/
for(i=0;i<strlen(enter);i++)
{
if(enter[i]>='0' && enter[i]<='9')
{
if (enter[i+1]>='0' && enter[i+1]<='9')
number=10*number+enter[i]-'0';
else
{
s[len].index=1;
s[len].a=10*number+enter[i]-'0';
s[len].b='0';
len++;
number=0;
}
}
else
{
s[len].index=0;
s[len].a=0;
s[len].b=enter[i];
len++;
}
}
if (enter[strlen(enter)-1]!='=')
{
s[len].index=0;
s[len].a=0;
s[len].b='=';
len++;
}
for(i=0;i<len;i++)
{
if (s[i].b=='=')
{
while(top1!=1)
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
printf("%d\n",s1[top1-1]);
break;
}
if (s[i].b==')')
{
while(s2[top2-1]!='(')
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
top2--;
}
else
{
if(s[i].index==1)
{
s1[top1]=s[i].a;
top1++;
}
else
{
if (comp1(s[i].b,s2[top2-1])==1)
{
s2[top2]=s[i].b;
top2++;
}
else
{
if(comp2(s[i].b,s2[top2-1])==0)
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
s2[top2]=s[i].b;
top2++;
}
}
}
}
getchar();
getchar();
}
jacmy23
2007-08-30
打赏
举报
回复
我看了一个程序,他把符号和数字分开保存,最后不知道怎么处理了下,能出结果!
那是什么方法?一直读不懂那个程序。
代码:
#include <stdio.h>
#include <string.h>
struct list
{
int index;
int a;
char b;
};
struct list s[100];
/*进堆比较*/
int comp1(char a,char b)
{
char op[4][2]={'*','/','+','-','(','(',')',')'};
int i;
int a1,b1;
for(i=0;i<4;i++)
if (a==op[i][0] || a==op[i][1])
{
a1=i;
break;
}
for(i=0;i<4;i++)
if (b==op[i][0] || b==op[i][1])
{
b1=i;
break;
}
if (a1<b1) return 1;
else return 0;
}
int comp2(char a,char b)
{
char op[4][2]={'(','(','*','/','+','-',')',')'};
int i;
int a1,b1;
for(i=0;i<4;i++)
if (a==op[i][0] || a==op[i][1])
{
a1=i;
break;
}
for(i=0;i<4;i++)
if (b==op[i][0] || b==op[i][1])
{
b1=i;
break;
}
if (a1<b1) return 1;
else return 0;
}
int oper(int a,int b,char op)
{
int result;
if(op=='*') result=a*b;
else if(op=='/') result=a/b;
else if(op=='+') result=a+b;
else if(op=='-') result=a-b;
return result;
}
int main()
{
int len=0,i=0,j;
int m,n,result;
char op;
int number=0;
char enter[100];
int s1[100],top1=0,top2=0;
char s2[100];
s2[top2]='(';top2++;
scanf("%s",enter); /*---------------------------------------------------------------------------------*/
for(i=0;i<strlen(enter);i++)
{
if(enter[i]>='0' && enter[i]<='9')
{
if (enter[i+1]>='0' && enter[i+1]<='9')
number=10*number+enter[i]-'0';
else
{
s[len].index=1;
s[len].a=10*number+enter[i]-'0';
s[len].b='0';
len++;
number=0;
}
}
else
{
s[len].index=0;
s[len].a=0;
s[len].b=enter[i];
len++;
}
}
if (enter[strlen(enter)-1]!='=')
{
s[len].index=0;
s[len].a=0;
s[len].b='=';
len++;
}
for(i=0;i<len;i++)
{
if (s[i].b=='=')
{
while(top1!=1)
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
printf("%d\n",s1[top1-1]);
break;
}
if (s[i].b==')')
{
while(s2[top2-1]!='(')
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
top2--;
}
else
{
if(s[i].index==1)
{
s1[top1]=s[i].a;
top1++;
}
else
{
if (comp1(s[i].b,s2[top2-1])==1)
{
s2[top2]=s[i].b;
top2++;
}
else
{
if(comp2(s[i].b,s2[top2-1])==0)
{
m=s1[top1-1];
top1--;
n=s1[top1-1];
top1--;
op=s2[top2-1];
top2--;
result=oper(n,m,op);
s1[top1]=result;
top1++;
}
s2[top2]=s[i].b;
top2++;
}
}
}
getchar();
getchar();
}
zz19910504
2007-08-30
打赏
举报
回复
栈结构,不过个人感觉很烦。。
laiwusheng
2007-08-30
打赏
举报
回复
栈
两种方式实现
表达式
计算
本文档是关于两种方式来实现
表达式
计算
的!
Qt
计算
器项目开发源码
(一)后缀
表达式
实现完整数学
表达式
的
计算
http://blog.csdn.net/guodongxiaren/article/details/24648839 (二)信号槽实现数学
表达式
合法性检查 http://blog.csdn.net/guodongxiaren/article/details/26006201 (三)...
课程设计题一:四则变量
表达式
计算
课程设计题一:四则变量
表达式
计算
go动态解析文本,进行
表达式
计算
golang 动态解析文本,进行算术
表达式
计算
,这方面我参考了 php 和 js。主要这个库是用来做一个编程语言,而不仅仅只是做
表达式
计算
。这里面有许多的递归操作,用来完成这些文本解析。速度杠杠的!
表达式
计算
(eval)
如果编译成功,则开始执行这一段代码,并返回字符串中的最后一个
表达式
会或语句的值,如果最后一个
表达式
或语句没有值,则最终返回undefifined。如果字符串抛出一个异常,这个异常将把该调用传递给eval
C语言
69,373
社区成员
243,079
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章