CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

关于表达式计算问题

楼主yk84(好人(专蹭百分贴))2004-08-01 14:36:14 在 C/C++ / C语言 提问

编写一个程序,其功能是:从键盘输入一个表达式字符串,其中包括数值子字符串以及+(加)、-(减)、*(乘)、/(除)四个运算符号与左右括号“(、)”;然后计算并输出该表达式的值。假设输入的表达式字符串总长度不超过60,且其中所包括的运算都是合法的(即在程序中不考虑不合法的运算)。例如,输入的表达式字符串为  
          1.5*(2.5+3.5)-(5.5-1)/3  
  输出结果为  
          1.5*(2.5+3.5)-(5.5-1)/3=7.5(计算结果)  
          要求结果的输出格式为  
          表达式字符串=计算结果    
   
  帮朋友要的,需要代码 问题点数:100、回复次数:8Top

1 楼skyfine(柳荣宏)回复于 2004-08-01 14:44:02 得分 5

一般的讲数据结构的书上都会有这样例子。看看书吧!Top

2 楼chon81(当我遇上你…)回复于 2004-08-01 14:48:06 得分 5

这个不是很像计算器.  
  上google去搜一下,很多啦.  
  写这个要懂得编译原理和一些数据结构(堆栈)Top

3 楼wansong(LostTemple)回复于 2004-08-01 14:53:50 得分 0

只要会入栈出栈就可以了Top

4 楼yk84(好人(专蹭百分贴))回复于 2004-08-01 19:50:54 得分 0

有例子代码吗??Top

5 楼JackyRao(一儿)回复于 2004-08-01 20:08:26 得分 5

先要定义运算符的优先级,在运用堆栈技术处理,详情请参阅《Pascal编程》国防科学技术大学出版社   姚廷宝教授等编写Top

6 楼baconbally(一屋不扫睡大觉)回复于 2004-08-01 20:24:30 得分 5

转化为后缀表达式  
  输出用一个宏Top

7 楼wansong(LostTemple)回复于 2004-08-01 22:09:43 得分 75

做了半天才做出来,都怪自己以前数据结构没怎么学好  
  这个程序支持double/int/float型数据的四则混合运算  
  且表达式的长度没有限制,支持表达式的合法性检测  
   
  #include   <stack>  
  #include   <iostream>  
  #include   <string>  
  using   namespace   std;  
   
  char   OP[10]={'+','-','*','/','(',')','#'};  
   
  //算符间的优先关系=====  
  int   precede[7][7]={  
  1,1,2,2,2,1,1,  
  1,1,2,2,2,1,1,  
  1,1,1,1,2,1,1,  
  1,1,1,1,2,1,1,  
  2,2,2,2,2,3,0,  
  1,1,1,1,0,1,1,  
  2,2,2,2,2,0,3};  
   
  char   Precede(char   op,char   c)//判断优先级  
  {  
  int   pos_op;  
  int   pos_c=7;  
  int   i;  
  for(i=0;i<7;i++)  
  {  
  if(op==OP[i])   pos_op=i;  
  if(c==OP[i])   pos_c=i;  
  }  
  if(pos_c==7)  
  return   '?';  
   
  switch(precede[pos_op][pos_c])  
  {  
  case   1:return   '>';  
  case   2:return   '<';  
  case   3:return   '=';  
  }  
  }  
   
  void   main()  
  {  
  stack<char>   OPTR;//操作符栈  
  OPTR.push('#');  
  stack<double>   OPND;//数据栈  
   
  cout<<"请输入表达式:";  
  string   str;//用这个string来保存这个表达式.下面的数据也是从中分解而来  
  cin>>str;  
  str+="#";  
  double   temp=0.0;  
  int   dot=0;  
  string::iterator   iter=str.begin();  
   
  while(*iter!='#'   ||   OPTR.top()!='#')  
  {  
  //从string里面分解出double型数值=================  
  if('0'<   *iter   &&   *iter   <   '9')  
  {  
  if(dot==0)//判断小数点  
  {  
  temp=10.0*temp+(*iter-48);  
  iter++;  
  continue;  
  }  
  if(dot==1)  
  {  
  temp=temp+(*iter-48)/10.0;  
  iter++;  
  continue;  
  }  
  }  
  if(*iter=='.')//判断小数点  
  {  
  dot=1;  
  iter++;  
  continue;  
  }  
  dot=0;  
  if(temp!=0.0)  
  {  
  OPND.push(temp);  
  temp=0.0;  
  }  
  //判断优先级===============================  
  switch(Precede(OPTR.top(),*iter))  
  {  
  case   '?':  
  cerr<<"输入表达式错误!";  
  return;  
  case   '<':  
  OPTR.push(*iter);  
  iter++;  
  break;  
  case   '=':  
  OPTR.pop();  
  iter++;  
  break;  
  case   '>':  
  double   left,right;  
  right   =   OPND.top();OPND.pop();  
  left   =   OPND.top();OPND.pop();  
  char   theta;  
  theta=OPTR.top();OPTR.pop();  
  switch(theta)  
  {  
  case   '+':OPND.push((left   +   right));break;  
   
  case   '-':OPND.push((left   -   right));break;  
   
  case   '*':OPND.push((left   *   right));break;  
   
  case   '/':  
  if   (right   !=   0)  
  {  
  OPND.push((left   /   right));  
  break;  
  }  
  else  
  return;  
  break;  
  }  
  }  
  }  
   
  //结果=====================================  
  iter=str.begin();  
  while(*iter!='#')  
  {  
  cout<<*iter;  
  iter++;  
  }  
  cout<<"="<<OPND.top()<<endl;  
  }Top

8 楼afxid()回复于 2004-08-01 22:50:08 得分 5

这个是NCRE变程大赛的复赛试题第4题啊Top

相关问题

  • VB,表达式计算函数!
  • 真正的表达式计算。
  • 数据窗口计算表达式
  • 怎么实现表达式计算器???
  • Java中如何计算表达式
  • IB.表达式计算.求sql语句
  • 计算24表达式计数问题
  • +1-2+3计算出表达式的值
  • 此时无法计算表达式
  • 计算字符串表达式

关键词

  • 数据结构
  • top
  • 表达式
  • opnd
  • 字符串
  • optr
  • 运算
  • theta
  • 输入
  • 计算

得分解答快速导航

  • 帖主:yk84
  • skyfine
  • chon81
  • JackyRao
  • baconbally
  • wansong
  • afxid

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo