• 表达式求值(二叉树方法/C++语言描述)(三)


      二叉树方法求值对运算数处理的方法与栈方法求值不太相同,除了将字符串中的运算数转换为浮点类型外,还需要生成新的节点:

     1 void Calculator::dealWithNumber(char *&pToken) throw(string)
     2 {
     3     if (!isdigit(*pToken) && *pToken != '-')
     4     {
     5         throw string("bad token '") + *pToken + "'";
     6     }
     7 
     8     BinaryTreeNode<Token> * node = new BinaryTreeNode<Token>();
     9     assert(node);
    10     node->_data._type = NUMBER;
    11     node->_data._data.num = strtod(pToken, &pToken);
    12     node->_leftChild = node->_rightChild = nullptr;
    13     _stkNodes.push(node);
    14 }

      对其他token的处理则和栈方法求值类似,请参考代码清单,这里不再赘述。

      公有方法calculate()直接调用了postOrder()方法,调用前清空用于存储浮点类型的栈,方法返回后这个栈的栈顶元素即为运算结果:

     1 double Calculator::calculate()
     2 {
     3     while (!_stkNumbers.empty())
     4     {
     5         _stkNumbers.pop();
     6     }
     7 
     8     BinaryTree::postOrder();
     9 
    10     assert(!_stkNumbers.empty());
    11     return _stkNumbers.top();
    12 }

      postOrder()方法重写了从BinaryTree类继承的postOrder()方法,它在后序遍历时遇到运算数则压栈,遇到运算符则弹栈计算:

     1 void Calculator::postOrder(BinaryTreeNode<Token> *node)
     2 {
     3     if (node)
     4     {
     5         postOrder(node->_leftChild);
     6         postOrder(node->_rightChild);
     7         // visit binary tree data
     8         if (node->_data._type == NUMBER)
     9         {
    10             _stkNumbers.push(node->_data._data.num);
    11         }
    12         else
    13         {
    14             assert(!_stkNumbers.empty());
    15             double d2 = _stkNumbers.top();
    16             _stkNumbers.pop();
    17             assert(!_stkNumbers.empty());
    18             double d1 = _stkNumbers.top();
    19             _stkNumbers.pop();
    20             char op = node->_data._data.op;
    21             _stkNumbers.push(calculate(d1, op, d2));
    22         }
    23     }
    24 }

    静态方法calculate()与栈方法求值中的也相同。

      最后编写主函数,大功告成!

  • 相关阅读:
    ubuntu ping响应慢的解决方法
    Linux串口中的超时设置
    GSM07.10协议中串口复用使用的校验算法
    交叉编译中的build、host和target
    mount img
    修改mysql默认字符编码出现的Job failed to start解决方法
    ubuntu下建立NFS共享,并用开发板挂载
    Linux上进行单片机开发
    LwIP移植和使用
    [buuctf] pwnrip
  • 原文地址:https://www.cnblogs.com/lets-blu/p/7291552.html
Copyright © 2020-2023  润新知