表达式求值(二叉树方法/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()与栈方法求值中的也相同。

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

posted @ 2017-08-05 21:11  Lets_Blu  阅读(335)  评论(0编辑  收藏  举报