首页 > 代码库 > 表达式求值(二叉树方法/C++语言描述)(三)
表达式求值(二叉树方法/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()方法,调用前清空用于存储浮点类型的栈,方法返回后这个栈的栈顶元素即为运算结果:
double Calculator::calculate() { while (!_stkNumbers.empty()) { _stkNumbers.pop(); } BinaryTree::postOrder(); assert(!_stkNumbers.empty()); return _stkNumbers.top(); }
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()与栈方法求值中的也相同。
最后编写主函数,大功告成!
表达式求值(二叉树方法/C++语言描述)(三)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。