关于表达式计算!

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
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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