`
javayestome
  • 浏览: 1029188 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

表达式 《c++沉思录》第八章

阅读更多
  1. /*
  2. *=====================================================================================
  3. *
  4. *Filename:eval.cpp
  5. *
  6. *Description:表达式,《c++沉思录》第8章
  7. *
  8. *Version:1.0
  9. *Created:2009年01月07日15时51分53秒
  10. *Revision:none
  11. *Compiler:gcc
  12. *
  13. *Author:LiWeiJian(mn),lwj1396@163.com
  14. *Company:hunanuniversity
  15. *
  16. *=====================================================================================
  17. */
  18. #include<iostream>
  19. #include<string>
  20. usingnamespacestd;
  21. classExpr_node
  22. {
  23. friendclassExpr;
  24. intuse;//引用计数
  25. public:
  26. virtualvoidprint(ostream&)const=0;
  27. virtualintdocompute()const=0;
  28. protected:
  29. Expr_node():use(1)
  30. {
  31. //cout<<"Expr_node(),use="<<use<<endl;
  32. }
  33. virtual~Expr_node()
  34. {
  35. //cout<<"~Expr_node()"<<this<<endl;
  36. }
  37. };
  38. classExpr
  39. {
  40. friendostream&operator<<(ostream&,constExpr&);
  41. Expr_node*p;
  42. public:
  43. Expr(int);//创建一个Int_node
  44. Expr(conststring&,Expr);//创建一个Unary_node
  45. Expr(conststring&,Expr,Expr);//创建一个Binary_node
  46. Expr(constExpr&t)
  47. {
  48. t.p->use++;
  49. //构造与赋值不一样
  50. //if(--p->use==0)
  51. //deletep;
  52. p=t.p;
  53. //cout<<"Expr"<<this<<"的use="<<p->use<<endl;
  54. }
  55. Expr&operator=(constExpr&);
  56. ~Expr()
  57. {
  58. if(--p->use==0)
  59. {
  60. //cout<<"~Expr()"<<this<<endl;
  61. deletep;
  62. }
  63. }
  64. intcompute()const
  65. {
  66. returnp->docompute();
  67. }
  68. };
  69. classInt_node:publicExpr_node
  70. {
  71. friendclassExpr;
  72. intn;
  73. Int_node(intk):n(k){}
  74. voidprint(ostream&o)const{o<<n;}
  75. intdocompute()const{returnn;}
  76. };
  77. classUnary_node:publicExpr_node
  78. {
  79. friendclassExpr;
  80. stringop;
  81. Expropnd;
  82. Unary_node(conststring&a,Exprb):
  83. op(a),opnd(b)
  84. {
  85. }
  86. voidprint(ostream&o)const
  87. {
  88. o<<"("<<op<<opnd<<")";
  89. }
  90. intdocompute()const
  91. {
  92. //暂定只能是负号
  93. if(op=="-")
  94. return-opnd.compute();
  95. elseif(op=="+")
  96. return+opnd.compute();
  97. else
  98. cout<<"error"<<endl;
  99. return-1;
  100. }
  101. };
  102. classBinary_node:publicExpr_node
  103. {
  104. friendclassExpr;
  105. stringop;
  106. Exprleft;
  107. Exprright;
  108. Binary_node(conststring&a,Exprb,Exprc):
  109. op(a),left(b),right(c)
  110. {
  111. }
  112. voidprint(ostream&o)const
  113. {
  114. o<<"("<<left<<op<<right<<")";
  115. }
  116. intdocompute()const
  117. {
  118. intleftval=left.compute();
  119. intrightval=right.compute();
  120. if(op=="-")returnleftval-rightval;
  121. if(op=="+")returnleftval+rightval;
  122. if(op=="*")returnleftval*rightval;
  123. if(op=="/"&&rightval!=0)returnleftval/rightval;
  124. return-1;
  125. }
  126. };
  127. Expr::Expr(intn)
  128. {
  129. //cout<<"Expr("<<n<<")"<<endl;
  130. p=newInt_node(n);
  131. //cout<<"Expr的地址"<<this<<endl;
  132. //cout<<"expr.expr_node的地址:"<<p<<endl;
  133. }
  134. Expr::Expr(conststring&op,Exprt)
  135. {
  136. //cout<<"Expr("<<op<<""<<t<<")"<<endl;
  137. p=newUnary_node(op,t);
  138. //cout<<"Expr的地址"<<this<<endl;
  139. //cout<<"expr.expr_node的地址:"<<p<<endl;
  140. }
  141. Expr::Expr(conststring&op,Exprleft,Exprright)
  142. {
  143. //cout<<"Expr("<<left<<""<<op<<""<<right<<")"<<endl;
  144. p=newBinary_node(op,left,right);
  145. //cout<<"Expr的地址"<<this<<endl;
  146. //cout<<"expr.expr_node的地址:"<<p<<endl;
  147. }
  148. Expr&
  149. Expr::operator=(constExpr&rhs)
  150. {
  151. rhs.p->use++;
  152. if(--p->use==0)
  153. deletep;
  154. p=rhs.p;
  155. return*this;
  156. }
  157. ostream&operator<<(ostream&o,constExpr&e)
  158. {
  159. e.p->print(o);
  160. returno;
  161. }
  162. intmain()
  163. {
  164. Expre=Expr("*",Expr("+",8,7),Expr("/",56,7));
  165. cout<<e<<"="<<e.compute()<<endl;
  166. }

分享到:
评论

相关推荐

    C++后缀表达式转前缀表达式

    C++后缀表达式转前缀表达式 C++程序中,后缀表达式转换为前缀表达式是一种常见的操作。为了完成这个操作,我们需要使用栈数据结构来存储和处理表达式中的操作符和操作数。 首先,让我们了解一下什么是后缀表达式和...

    c++沉思录的21章代码录入

    《C++沉思录》是一本深受欢迎的C++编程教程,它深入探讨了C++语言的核心概念和技术,旨在帮助读者理解并掌握这门复杂的语言。该书的第21章通常会涵盖一些高级主题,可能包括模板元编程、STL(标准模板库)的深入使用...

    计算器表达式c++程序

    【标题】"计算器表达式c++程序"涉及的是在C++编程语言中实现一个计算器,能够处理简单的数学表达式,包括分数、整数和小数的运算。这通常需要理解和运用C++的基本语法,以及对数学运算符的处理。 【描述】提到"已经...

    c++数学表达式解析

    在C++编程中,实现一个数学表达式解析器是一项常见的任务,它允许程序处理和求解用户输入的数学表达式。本项目旨在提供一个简单易懂的C++计算器实现,支持括号和基本的四则运算(加、减、乘、除)。通过使用波兰...

    后缀表达式c++实现代码

    std::string src = argc &gt; 1 ? argv[1] : "12+((2+73)*4)-15"; std::cout ; Expression expression; Expression::PrefixType result; int ret = expression.ToPrefix(src, result); if (ret !... }

    c++ 计算表达式结果(二叉树、后缀表达式)

    本篇将详细讲解如何使用C++来处理中缀表达式,并通过构建二叉树以及转换为后缀表达式的方式来求解表达式的结果。 首先,我们要理解什么是中缀表达式。中缀表达式是我们在日常生活中最常使用的表达式形式,例如 "2 +...

    表达式C++_C++_源码

    "表达式C++_C++_源码"这个标题暗示了我们讨论的主题是关于使用C++来处理数学表达式的源代码实现。C++在科学计算、游戏开发、系统软件等多个领域都有广泛应用,其强大的运算能力对于处理复杂算式计算尤为适用。 描述...

    C++ 11 lambda 表达式

    C++ 11引入了lambda表达式,这是一个强大的特性,极大地增强了C++的函数式编程能力。Lambda表达式允许在程序中直接定义匿名函数,并且可以直接在需要的地方使用,无需预先声明。这对于处理回调函数、简化算法实现...

    c++沉思录.pdf c++学习的必备数据,

    根据提供的信息,我们可以推断出该文档主要涉及的是C++编程语言的学习资料——《C++沉思录》。虽然给出的部分内容主要是关于版权、转载规定以及联系方式等,并没有直接涉及技术内容,但我们仍然可以根据文档标题、...

    c++沉思录 10年编程的真知灼见

    《C++沉思录》是一本面向有一定C++编程经验的开发者所编写的书籍,它凝聚了作者10年的编程智慧和实践经验。该书旨在帮助读者深入理解C++语言的本质,提升编程技巧,从而达到精通C++程序设计的水平。 在C++的世界里...

    数学表达式计算c++

    1. **表达式解析**:在C++中,实现表达式计算的第一步是将输入的字符串转换为可执行的形式。这通常涉及到语法分析(词法分析和语法分析),可能需要使用到编译原理中的概念,如有限状态自动机(FSA)或推导树。你...

    C++ 中的 Lambda 表达式

    ### C++ 中的 Lambda 表达式 #### 引言 C++11引入了许多重要的新特性,其中最显著的一项是Lambda表达式。这一特性极大地简化了代码编写过程,使得开发者能够更方便地创建匿名函数对象。Lambda表达式在很多场景下都...

    后缀表达式的求解(C++)

    在C++编程中,处理后缀表达式主要有以下步骤: 1. **中缀转后缀**: - 使用两个栈,一个用于存储操作数,另一个用于存储已遇到的操作符。 - 从左到右遍历中缀表达式,如果遇到数字,直接压入操作数栈;如果遇到...

    中缀表达式转后缀表达式的C++代码

    用dev c++写的代码,附有啰里啰嗦的注释和测试样例。太简单了不好意思要分。

    中缀表达式 c++ 计算

    编写一程序直接计算任意输入的中缀表达式的值,且不能采用先转换到后缀表达式再计算的方式。

    zzbd.rar_正则表达式_正则表达式c++

    8. **正则表达式陷阱** - 避免使用贪婪匹配,可能导致不必要的大范围匹配。使用非贪婪量词?来限制匹配。 - 注意正则表达式中的顺序,因为它们是左到右解析的,可能导致意料之外的结果。 9. **扩展应用** - 在...

    中缀表达式计算C++实现

    本主题主要探讨如何使用C++语言来实现中缀表达式的计算。 首先,我们需要理解中缀表达式的计算原理。这通常涉及到两个关键步骤:语法分析(将中缀表达式转换为抽象语法树AST)和求值(遍历AST并执行相应的运算)。...

    正则表达式C++中编程教程

    在C++编程中,正则表达式是一种强大的文本处理工具,用于模式匹配和字符串操作。Boost库提供了对正则表达式的支持,使开发者能够轻松地在C++程序中使用正则表达式。以下是对正则表达式在C++中使用的详细讲解。 首先...

    表达式求值C++代码(含实验报告)

    在本项目中,我们主要关注的是使用C++编程语言实现表达式求值的功能。这是一个典型的数据结构与算法问题,尤其适用于计算机科学与信息技术专业的学生进行实践学习。C++是一种强大的编程语言,它提供了丰富的特性来...

Global site tag (gtag.js) - Google Analytics