| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 590 人关注过本帖
标题:求表达式的值
只看楼主 加入收藏
霜之哀伤
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-2-10
收藏
 问题点数:0 回复次数:4 
求表达式的值
以字符序列输入一包括加、减、乘、除的正确的四则运算算式(可以包含括号,不包含变量和函数调用),编写程序,利用栈等将中缀表达式转换为后缀表达式并计算该表达式的值
帮帮忙吧!
搜索更多相关主题的帖子: 表达 
2006-12-11 21:03
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 

/*仅供参考*/
int is_operation(char op)/*判断是否为运算符*/
{
switch(op)
{
case'+':
case'-':
case'*':
case'/':
case '^':return(1); //
default:return(0);
}
}

int priority(char op)/*判断进栈各运算符的优先级*/
{
switch(op)
{
case'#':return(-1);
case'(':return(0);
case'+':
case'-':return(1);
case'*':
case'/':return(2);
case'^':return(3);//
default:return(-1);
}
}

void postfix(char e[],char f[])/*中缀转换成后缀表达式*/
{
int i=0,j=0;
char opst[100];/*栈*/
int top,t;

top=0;/*当前顶指针*/
opst[top]='#';top++;/*将#放在栈底作为运算结束标志*/
while(e[i]!='#')/*核心语句段*/
{
if((e[i]>='0'&&e[i]<='9')||e[i]=='.')
{
f[j++]=e[i];/*遇到数字和小数点直接写入后缀表达式*/
}
else
if(e[i]=='(')/*遇到左括号直接写入操作符栈*/
{
opst[top]=e[i];
top++;
}
else
if(e[i]==')')/*遇到右括号和其对应的左括号后的操作符全部写入后缀表达式*/
{
t=top-1;
while(opst[t]!='(')
{
f[j++]=opst[--top];
t=top-1;
}
top--;/*出栈*/
}
else
if(is_operation(e[i]))
{
f[j++]=' ';
while(priority(opst[top-1])>=priority(e[i]))
{
f[j++]=opst[--top];
}
opst[top]=e[i];
top++;/*当前元素进栈*/
}
i++;/*处理下一个元素*/
}
while(top)
{
f[j++]=opst[--top];
}
f[j]='\0';
}

float readnumber(char f[],int *i)/*将字符转换为数值*/
{
float x=0.0;
int k=0;/*用K标记小数部分的位数*/

while(f[*i]>='0'&&f[*i]<='9')/*处理整数部分*/
{
x=x*10+(f[*i]-'0');
(*i)++;
}
if(f[*i]=='.')/*处理小数部分*/
{
(*i)++;
while(f[*i]>='0'&&f[*i]<='9')
{
x=x*10+(f[*i]-'0');
(*i)++;
k++;
}
}
while(k!=0)
{
x=x/10.0;
k=k-1;
}
/*printf("%f\n",x);*/
return(x);
}

double evalpost(char f[])
{
double x1,x2,obst[100];/*栈*/
int i=0,top=0;

while(f[i]!='#')/*还有元素要被处理*/
{
if(f[i]>='0'&&f[i]<='9')
{
obst[top]=readnumber(f,&i);
top++;/*将操作数进栈*/
}
else
if(f[i]==' ')/*用空格将两操作数隔开*/
{
i++;
}
else
if(f[i]=='+')/*做加法运算*/
{
x2=obst[--top];/*第一个操作数出栈*/
x1=obst[--top];/*第二个操作数出栈*/
obst[top]=x1+x2;/*两操作数进行运算,并将所得结果进栈*/
/*printf("%f",obst[top]); */
top++;
i++;
}
else
if(f[i]=='-')/*做减法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1-x2;
top++;
i++;
}
else
if(f[i]=='*')/*做乘法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1*x2;
top++;
i++;
}
else
if(f[i]=='/')/*做除法运算*/
{
x2=obst[--top];
x1=obst[--top];
obst[top]=x1/x2;
top++;
i++;
}
else
if(f[i]=='^')//
{
x2=obst[--top];
x1=obst[--top];
obst[top]=pow(x1,x2);
top++;
i++;
}

}

return(obst[0]);/*返回最终运算结果*/
}


倚天照海花无数,流水高山心自知。
2006-12-11 22:01
霜之哀伤
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2006-2-10
收藏
得分:0 
谢谢了
2006-12-15 18:54
senyee
Rank: 1
等 级:新手上路
帖 子:422
专家分:0
注 册:2006-11-28
收藏
得分:0 


这么长?

菜鸟~~请多指教~~
2006-12-15 21:48
zhou
Rank: 1
等 级:禁止发言
帖 子:429
专家分:0
注 册:2006-6-16
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2008-03-30 14:18
快速回复:求表达式的值
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012369 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved