网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 大学论文导航 设计下载 最新论文 下载排行 原创论文 论文源代码
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > C/C++ > 正文

C++二叉树应用:计算表达式

来源:http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 14/07/08

鉴于大家对C/C++十分关注,我们编辑小组在此为大家搜集整理了“C++二叉树应用:计算表达式”一文,供大家参考学习!

  昨天晚上,我花了大把的时间研究里面二叉树应用解决计算表达式的问题,一直就没理解,主要是觉得是不是自己错了,又懒,不愿意自己把代码敲到电脑里看看,结果浪费了很多时间。所以还是提醒大家,代码这种东西,有什么好多看的,觉得他错了就自己敲到电脑里去看看!其实也没错太多,就是少了一些东西,导致原代码里的括号完全没有意义,也就是说,书中的代码虽然考虑到了计算表达式中的括号,却什么都没有做,而这其实只要稍稍改进:加一个flag存储上次读到的char,如果是‘)’的话,就要把左式当成运算数来计算

  好了,把正确的代码贴在下面:

  #include <iostream>

  using namespace std;

  class calc

  {

  enum Type {DATA, ADD, SUB, MULTI, DIV, OPAREN, CPAREN, EOL};

  struct node

  {

  Type type;

  int data;

  node *lchild, *rchild;

  node(Type t, int d=0, node *lc=NULL, node *rc=NULL)

  {

  type=t; data=d; lchild=lc; rchild=rc;

  }

  };

  node *root;

  node *create(char * &s);

  Type getToken (char * &s, int &value);

  int result (node *t);

  public:

  calc (char *s) {root=create(s);}

  int result() {if (root==NULL) return 0;

  return result(root);}

  };

  calc::node *calc::create(char * &s)

  {

  node *p, *root=NULL;

  Type returnType,flag=DATA;

  int value;

  while (*s)

  {

  flag=returnType;

  returnType=getToken(s,value);

  switch (returnType)

  {

  case DATA:

  case OPAREN:

  if (returnType == DATA) p=new node(DATA,value);

  else p=create(s);

  if (root==NULL) root=p;

  else if (root->rchild==NULL) root->rchild=p;

  else root->rchild->rchild=p;

  break;

  case CPAREN:

  case EOL: return root;

  case ADD:

  case SUB:

  root=new node(returnType,0,root);

  break;

  case MULTI:

  case DIV:

  if (root->type==DATA || root->type==MULTI || root->type==DIV || flag==OPAREN)

  root=new node(returnType,0,root);

  else root->rchild=new node(returnType,0,root->rchild);

  }

  }

  return root;

  }

  calc::Type calc::getToken(char *&s, int &data)

  {

  char type;

  while (*s=='' '') ++s;

  if (*s>=''0'' && *s<=''9'')

  {

  data=0;

  while (*s>=''0'' && *s<=''9'') {data=data*10+ *s-''0''; ++s;}

  return DATA;

  }

  if (*s == ''\0'') return EOL;

  type =*s; ++s;

  switch(type)

  {

  case ''+'':return ADD;

  case ''-'':return SUB;

  case ''*'':return MULTI;

  case ''/'':return DIV;

  case ''('':return OPAREN;

  case '')'':return CPAREN;

  default: return EOL;

  }

  }

  int calc::result(node *t)

  {

  int num1,num2;

  if (t->type == DATA) return t->data;

  num1=result(t->lchild);

  num2=result(t->rchild);

  switch(t->type)

  {

  case ADD:t->data=num1+num2;break;

  case SUB:t->data=num1-num2;break;

  case MULTI: t->data=num1*num2;break;

  case DIV:t->data=num1/num2;break;

  }

  return t->data;

  }

  int main()

  {

  char equation[256];

  cin>>equation;

  //calc exp("3*(2+(6/2))");

  calc exp(equation);

  cout<<exp.result()<<endl;

  return 0;

  }

  • 上一篇资讯: C++从零开始——何谓类
  • 下一篇资讯: C++入门 函数的作用
  • 网学推荐

    免费论文

    原创论文

    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号