| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1251 人关注过本帖
标题:请问如何实现一个算术表达式求值
只看楼主 加入收藏
swk6100
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2005-8-11
收藏
 问题点数:0 回复次数:3 
请问如何实现一个算术表达式求值
各位好,我想请问一下:如何可以实现一个算术表达式的求值啊?
例如:直接输入2+12*(5-1+(4/3))*2
搜索更多相关主题的帖子: 求值 算术 表达 
2006-04-24 17:45
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

#include<iostream>
#include<cstdlib>
#include<cctype>

//函数原型
int addsubt();
int multdiv();
int number();
void error();

//全局表达式缓冲器
static char expr[100];
static int pos;

/////////////////////////
//main函数
////////////////////////
int main()
{
int ans;

do
{
//初始化字符串下标
pos=0;

//读取表达式
std::cout<<"Enter expression (0 to quit):"<<endl:
std::cin>>expr;

//表达式求值
ans=addsubt();
if(expr[pos]!='\0')
error();
if(ans!=0)
std::cout<<ans<<endl;
}
while(ans!=0);

return 0;
}

///////////////////////
//逆序递归的顶层:加/减
///////////////////////
int addsubt()
{
int rtn = multdiv();
while(expr[pos]=='+'||expr[pos]=='-')
{
int op = expr[pos++];
int opr2=multdiv();
if(op=='+') rtn+=opr2;
else rtn-=opr2;
}
return rtn;
}

///////////////////////
//最高优先级:乘/除
///////////////////////
int multdiv()
{
int rtn = number();
while(expr[pos]=='*'||expr[pos]=='/')
{
int op = expr[pos++];
int opr2=number();
if(op=='*') rtn*=opr2;
else rtn/=opr2;
}
return rtn;
}

///////////////////////
//开括号
///////////////////////
int number()
{
int rtn;
if(expr[pos]=='(')
{
pos++;
rtn=addsubt(); //返回顶层
if(expr[pos]!=')') //必须有‘)’
error();

return rtn;
}
if(!isdigit(expr[pos]))
error();
rtn=atoi(expr+pos);
while(isdigit(expr[pos]))
pos++;

return rtn;
}

///////////////////////
//语法错误
///////////////////////
void error()
{
etd::cout<<'\r';
while(pos--)
std::cout<<' ';
std::cout<<"^syntax error"<< std::endl <<'\a';

exit(-1);
}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-26 09:48
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

我还想问一下,用指针遍历字符数组,应该怎么做啊?比如:将输入的字符串逐个压入栈A,直到扫到第一个‘)’,然后开始从栈A弹出,并把弹出的数压入另外一个栈B中(这个栈内的数字都是无括号的),直到弹出‘(’时停止,计算栈B中的无括号表达式,并将结果存入栈A中,然后栈A的指针移到刚才弹出第一个右括号的位置,继续重复见面的行为,直到没有括号,就可以计算无括号的表达式了。
但是具体实现起来好相复杂很多,请问怎么搞?


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-04-26 10:34
starrysky
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:华中科技大学EI -T0405
等 级:版主
威 望:11
帖 子:602
专家分:1
注 册:2005-9-12
收藏
得分:0 

我的方法是对所有运算符号都设置优先级,*/大于+-,括号内的大于括号外的
只要有第2个运算符号出现, 就比较这两个运算符号的优先级,如果第2个符号优先级大, 则第一个运算符号入栈, 继续等待第三个运算符号,如果第2个符号优先级小,则进行第一个运算符号的运算.
具体方法见如下帖
http://www.bc-cn.net/bbs/dispbbs.asp?boardID=179&ID=34970&page=1


我的征途是星辰大海
2006-04-27 16:17
快速回复:请问如何实现一个算术表达式求值
数据加载中...
 
   



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

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