使用 std::map<std::string, int> 计算表达式树
Evaluating expression tree using std::map<std::string, int>
我不确定如何使用map函数来评估我的树表达式。函数是这样的
int Tree::evaluate(std::map< std::string, int > ipMap){
我的老师给了我一个提示,让我看看我的函数到后序打印的例子,但我不确定它如何应用于此。在这里:
void Tree::postOrderPrint(){
if(NodeType==TYPE_OPERATOR)
{
leftPtr->postOrderPrint();
rightPtr->postOrderPrint();
std::cout<< Op << " " ;
}
else
{
std::cout<< Op << " " ;
}
}
如果树已经构建,从以前的函数解析的字符串,实际上这个函数所做的一切都等同于以下函数
int arithmetic_expression::evaluateTree(TreeNodePtr rootPtr)
{
if ((rootPtr->Op=="+") | (rootPtr->Op=="-")|(rootPtr->Op=="*")|(rootPtr->Op== "/"))
{
if (rootPtr->Op=="+")
{
return(evaluateTree(rootPtr->leftPtr)+ evaluateTree(rootPtr->rightPtr));
}
if (rootPtr->Op=="-")
{
return(evaluateTree(rootPtr->leftPtr)- evaluateTree(rootPtr->rightPtr));
}
if (rootPtr->Op=="*")
{
return(evaluateTree(rootPtr->leftPtr)* evaluateTree(rootPtr->rightPtr));
}
if (rootPtr->Op=="/")
{
return(evaluateTree(rootPtr->leftPtr)/ evaluateTree(rootPtr->rightPtr));
}
}
else
{
int Number;
std::istringstream(rootPtr->Op) >> Number;
return(Number);
}
}
以下是调用函数的内容:
int arithmetic_expression::evaluate_Expression(std::map< std::string, int > ipMap)
{
if (tree != NULL){
return(tree->evaluate(ipMap));
}
else
return(0);
}
这看起来有意义吗?
int Tree::evaluate(std::map< std::string, int > ipMap){
std::map<std::string, int >::iterator myIter;
myIter=ipMap.find(Op);
{
if (myIter=="+")
{
return(evaluate(leftPtr)+ evaluate(rightPtr))
}
if (myIter=="-")
{
return(evaluate(leftPtr)- evaluate(rightPtr));
}
if (myIter=="*")
{
return(evaluate(leftPtr)* evaluate(rightPtr));
}
if (myIter=="/")
{
return(evaluate(leftPtr)/ evaluate(rightPtr));
}
}
else{
根据注释,映射包含表达式,您需要使用该表达式的结果更新关联的值。 为此,您需要先分析字符串并构建表达式树,然后才能对其进行计算。
int Tree::evaluate(std::map< std::string, int > ipMap){
std::map< std::string, int >::iterator it;
for (it=ipMap.begin(); it != ipMap.end(); ++it) {
Tree tree;
tree.parse(it->first);
*it = tree.postOrderEvaluate();
}
}
由于您没有绑定到 evaluate
函数中的任何特定树,因此它可以是静态成员函数(或自由函数)。
int Tree:postOrderEvaluate()
将遵循以下Tree:postOrderPrint()
:1)评估左侧子树,2)评估右侧子树,3)对两个结果执行操作,4)返回当前子树的结果。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- std::condition_variable::wait()如何评估给定的谓词
- 如何获取std::result_of函数的返回类型
- std::原子加载和存储都需要吗
- 将对象移动到std::shared_ptr
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 是std :: set&lt; std :: future&gt;不可能存在
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>
- std::map<std::set, double> AND std:<long>map< std::p air<long, long>, double>
- 如何获取std::vector<DMatch>