CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

求字符串表达式的值

楼主j_x_y(稀里糊涂)2005-06-19 02:35:36 在 C/C++ / C语言 提问

用户从键盘输入一个数学表达式   如:3+5*(4+8)/2,求值  
  谁能提供一下详细的代码,最好有注释 问题点数:100、回复次数:13Top

1 楼j_x_y(稀里糊涂)回复于 2005-06-19 02:36:26 得分 0

3+5*(4+8)/2   是一个字符串Top

2 楼OpenHero(开勇)回复于 2005-06-19 03:07:06 得分 0

怎么要求都这么高阿???  
  有代码,还有注释???  
  有这样学习编程的马?  
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
   
  随便找一个计算器的代码就好了~~~  
  楼主网上好多的Top

3 楼nasi00(莫傲·逍遥)回复于 2005-06-19 05:27:12 得分 80

以前写的,还支持小数呢……  
   
  #include   <iostream>  
  using   namespace   std;  
   
  #include   <stack>  
  #include   <string>  
  #include   <cstdlib>  
   
  void   init(string&   s)  
  {  
  getline(cin,s);  
  s+="@";  
  }  
   
  bool   is_optr(char   c)  
  {  
  string   optr_list("+-*/()@");  
  for(int   i=0;i<optr_list.size();i++)  
  if(c==optr_list[i])  
  return   true;  
  return   false;  
  }  
   
  char   first(char   op1,   char   op2)  
  {  
  string   tab[7];  
  tab[0]=">><<<>>";  
  tab[1]=">><<<>>";  
  tab[2]=">>>><>>";  
  tab[3]=">>>><>>";  
  tab[4]="<<<<<=E";  
  tab[5]=">>>>E>>";  
  tab[6]="<<<<<E=";  
  string   optr_list("+-*/()@");  
   
  int   op1_loc,   op2_loc;  
   
  for(op1_loc=0;op1_loc<optr_list.size();op1_loc++)  
  if(optr_list[op1_loc]==op1)  
  break;  
  for(op2_loc=0;op2_loc<optr_list.size();op2_loc++)  
  if(optr_list[op2_loc]==op2)  
  break;  
   
  return   tab[op1_loc][op2_loc];  
  }  
   
  double   operate(double   x,   char   op,   double   y)  
  {  
  switch(op)   {  
  case   '+':  
  return   x+y;  
  break;  
  case   '-':  
  return   x-y;  
  break;  
  case   '*':  
  return   x*y;  
  break;  
  case   '/':  
  return   x/y;  
  break;  
  }  
  return   -1;  
  }  
   
  double   calc(string&   s)  
  {  
  stack<char>   optr;  
  optr.push('@');  
  stack<double>   opnd;  
   
  char   c=s[0];  
  s.erase(0,1);  
   
  while(   c!='@'   ||   optr.top()!='@'   )   {  
  if(   !is_optr(c)   )   {  
  string   num;  
   
  num.insert(num.begin(),   c);  
  int   loc=0;  
  while(   !is_optr(s[loc])   )  
  loc++;  
   
  string   num2(s,0,loc);  
  num+=num2;  
  s.erase(0,loc);  
   
  double   x=atof(num.c_str());  
  opnd.push(x);  
  c=s[0];  
  s.erase(0,1);  
  }  
  else   {  
  switch(   first(optr.top(),   c)   )   {  
  case   '<':  
  optr.push(c);  
  c=s[0];  
  s.erase(0,1);  
  break;  
  case   '=':  
  optr.pop();  
  c=s[0];  
  s.erase(0,1);  
  break;  
  case   '>':  
  char   op;  
  op=optr.top();  
  optr.pop();  
   
  double   a,b;  
  a=opnd.top();  
  opnd.pop();  
  b=opnd.top();  
  opnd.pop();  
   
  double   res;  
  res=operate(b,op,a);  
  opnd.push(res);  
   
  break;  
  }  
  }  
  }  
   
  return   opnd.top();  
  }  
   
  int   main()  
  {  
  string   exp;  
  double   ans;  
   
  init(exp);  
  ans=calc(exp);  
  cout<<ans<<endl;  
   
  return   0;  
  }Top

4 楼yvhkdragon(剑客)回复于 2005-06-19 09:13:42 得分 0

顶!Top

5 楼guyanhun(老婆说的都是对的!努力做个好老公!)回复于 2005-06-19 09:49:20 得分 0

不错.UPTop

6 楼jixingzhong(瞌睡虫·星辰)回复于 2005-06-19 10:06:07 得分 0

不错不错!!  
   
   
  UP!!  
   
   
  Top

7 楼zhangyuebin()回复于 2005-06-19 10:06:16 得分 0

顶!!!Top

8 楼yangman211()回复于 2005-06-19 12:34:58 得分 0

upTop

9 楼whatsouta(某疯子)回复于 2005-06-19 14:02:41 得分 5

数据结构和算法   教程上有Top

10 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-19 14:14:45 得分 5

编译原理上有。Top

11 楼foochow(无聊,灌水......)回复于 2005-06-19 15:07:30 得分 5

这个很简单啊,好多书上都有,多动手翻翻书^_^Top

12 楼csucdl(csucdl)回复于 2005-06-19 15:11:02 得分 0

路过学习  
  Top

13 楼mostideal(三甲)回复于 2005-06-19 17:39:31 得分 5

看编译原理。。Top

相关问题

  • 字符串表达式如何求值?
  • 计算字符串表达式的值(50分)
  • 求可以把字符串转换成求值的表达式函数!
  • 如何将一个字符串转换为能计算的数值表达式
  • 字符串表达式解析
  • 正则表达式,截取字符串
  • 字符串正则表达式问题
  • 字符串解析(正则表达式)!!!
  • 字符串转数学表达式
  • 字符串转数学表达式

关键词

  • 代码
  • exp
  • top
  • optr
  • opnd
  • loc
  • erase
  • tab
  • num
  • op

得分解答快速导航

  • 帖主:j_x_y
  • nasi00
  • whatsouta
  • zhousqy
  • foochow
  • mostideal

相关链接

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

广告也精彩

反馈

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