本文整理汇总了C++中ExpressionNode::getFirstChild方法的典型用法代码示例。如果您正苦于以下问题:C++ ExpressionNode::getFirstChild方法的具体用法?C++ ExpressionNode::getFirstChild怎么用?C++ ExpressionNode::getFirstChild使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ExpressionNode
的用法示例。
在下文中一共展示了ExpressionNode::getFirstChild方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: operation
ExpressionNode::ExpressionNode(const ExpressionNode & other): //copy constructor
type(other.getType()), operation(other.getOperation()), activechildren(other.getOperation()->getArity()),
right(0), firstChild(0), variable(other.getVariable()), value(other.getValue())
{
setRight(other.getRight());
setFirstChild(other.getFirstChild()); // automatically also sets other children
}
示例2: findParentOf
ExpressionNode* ExpressionNode::findParentOf(const ExpressionNode& target)
{
ExpressionNode * currentNode = this;
std::stack <ExpressionNode*> nodeStack;
ExpressionNode * parent = 0;
while (true)
{
if (currentNode != 0)
{
if (currentNode == &target)
{
return parent;
}
nodeStack.push(currentNode);
parent = currentNode;
currentNode = currentNode->getFirstChild();
}
if (nodeStack.size() == 1) // only root left in stack
{
// target not found
throw TargetNotFoundError();
}
currentNode = nodeStack.top();
nodeStack.pop();
currentNode = currentNode->getRight();
}
}
示例3: replace
void ExpressionNode::replace(const ExpressionNode &newNode)
{
std::clog << "...<replacing> " << *this << " with " << newNode << std::endl;
//ExpressionNode *curOld;
//ExpressionNode *curNew;
setType(newNode.getType());
setOperation(newNode.getOperation());
// setRight(newNode.getRight());
setFirstChild(newNode.getFirstChild()); // automatically also sets other children
//curOld = firstChild;
//curNew = newNode.getFirstChild();
//while (curNew != 0)
//{
//curOld->setRight(curNew->getRight());
//curOld = curOld->getRight();
//curNew = curNew->getRight();
//}
setVariable(newNode.getVariable());
setValue(newNode.getValue());
std::clog << "...</replacing>" << std::endl;
}
示例4:
bool ExpressionNode::operator== (const ExpressionNode& other) const
{
ExpressionNode *selfptr;
ExpressionNode *otherptr;
if (getType() == other.getType() &&
getOperation() == other.getOperation() &&
getVariable() == other.getVariable() &&
getValue() == other.getValue() )
{
selfptr = firstChild;
otherptr = other.getFirstChild();
while (selfptr != 0 && otherptr != 0)
{
if (*selfptr == *otherptr)
{
selfptr = selfptr->getRight();
otherptr = otherptr->getRight();
}
else
{
return false;
}
}
if (selfptr == 0 && otherptr == 0)
{
return true;
}
else
{
assert(selfptr != otherptr);
return false;
}
}
else
{
return false;
}
}
示例5: simplify
ExpressionNode BinaryOperation::simplify(const ExpressionNode& root) const
{
ExpressionNode* left = root.getFirstChild();
if (left != 0)
{
if (left->getRight() != 0)
{
if ((left->getRight())->getRight() != 0)
{
throw ExpressionNode::WrongArityError("> 2 arguments for BinaryOperation");
}
return simplify( *left, *(left->getRight()) );
}
else
{
cerr << left << endl;
throw ExpressionNode::WrongArityError("only 1 argument for BinaryOperation");
}
}
else
{
throw ExpressionNode::WrongArityError("No arguments for BinaryOperation");
}
}
示例6: addTerms
ExpressionNode Addition::addTerms(const ExpressionNode& term1, const ExpressionNode& term2) const
{
clog << "checkpoint addTerms" << endl;
Number coefficient1;
Number coefficient2;
const ExpressionNode * varpart1;
const ExpressionNode * varpart2;
ExpressionNode * left;
ExpressionNode * right;
ExpressionNode newRight;
ExpressionNode newCoef;
ExpressionNode newNode;
if (term1.getType() == NUMBER)
{
coefficient1 = term1.getValue();
varpart1 = 0;
}
else if (term1.getType() == OPERATION)
{
if (term1.getOperation() == &MULTIPLICATION)
{
left = term1.getFirstChild();
right = left->getRight();
if (left->getType() == NUMBER)
{
coefficient1 = left->getValue();
varpart1 = right;
}
else if (right->getType() == NUMBER)
{
coefficient1 = right->getValue();
varpart1 = left;
}
else
{
coefficient1 = MULTIPLICATION.getIdentity();
varpart1 = &term1;
}
}
else
{
coefficient1 = MULTIPLICATION.getIdentity();
varpart1 = &term1;
}
}
else // VARIABLE
{
assert(term1.getType() == VARIABLE);
coefficient1 = MULTIPLICATION.getIdentity();
varpart1 = &term1;
}
if (term2.getType() == NUMBER)
{
coefficient2 = term2.getValue();
varpart2 = 0;
}
else if (term2.getType() == OPERATION)
{
if (term2.getOperation() == &MULTIPLICATION)
{
left = term2.getFirstChild();
right = left->getRight();
if (left->getType() == NUMBER)
{
coefficient2 = left->getValue();
varpart2 = right;
}
else if (right->getType() == NUMBER)
{
coefficient2 = right->getValue();
varpart2 = left;
}
else
{
coefficient2 = MULTIPLICATION.getIdentity();
varpart2 = &term2;
}
}
else
{
coefficient2 = MULTIPLICATION.getIdentity();
varpart2 = &term2;
}
}
else // VARIABLE
{
assert(term2.getType() == VARIABLE);
coefficient2 = MULTIPLICATION.getIdentity();
varpart2 = &term2;
}
if (varpart1 != 0 && varpart2 != 0)
{
if (*varpart1 == *varpart2)
{
clog << "addTerms simplify like terms" << endl
<< "coef1: " << coefficient1 << " var1: " << *varpart1 << endl
//.........这里部分代码省略.........
示例7: isCompatible
bool Addition::isCompatible(const ExpressionNode& term1, const ExpressionNode& term2) const
{
clog << "checkpoint isAddable(" << term1 << ", " << term2 << ")" << endl;
const ExpressionNode * varpart1(0);
const ExpressionNode * varpart2(0);
const ExpressionNode * left;
const ExpressionNode * right;
if (term1.getType() == NUMBER)
{
varpart1 = 0;
}
else if (term1.getType() == OPERATION)
{
if (term1.getOperation() == &MULTIPLICATION)
{
left = term1.getFirstChild();
right = left->getRight();
if (left->getType() == NUMBER)
{
varpart1 = right;
}
else if (right->getType() == NUMBER)
{
varpart1 = left;
}
else
{
varpart1 = &term1;
}
}
else
{
varpart1 = &term1;
}
}
else // VARIABLE
{
assert(term1.getType() == VARIABLE);
varpart1 = &term1;
}
if (term2.getType() == NUMBER)
{
varpart2 = 0;
}
else if (term2.getType() == OPERATION)
{
if (term2.getOperation() == &MULTIPLICATION)
{
left = term2.getFirstChild();
right = left->getRight();
if (left->getType() == NUMBER)
{
varpart2 = right;
}
else if (right->getType() == NUMBER)
{
varpart2 = left;
}
else
{
varpart2 = &term2;
}
}
else
{
varpart2 = &term2;
}
}
else // VARIABLE
{
assert(term2.getType() == VARIABLE);
varpart2 = &term2;
}
if (varpart1 != 0 && varpart2 != 0)
{
if (*varpart1 == *varpart2)
{
return true;
}
else
{
return false;
}
}
else
{
if (varpart1 == 0 && varpart2 == 0)
{
// both numbers
return true;
}
else
{
return false;
}
}
//.........这里部分代码省略.........
示例8: simplify
ExpressionNode Addition::simplify(ExpressionNode& left, ExpressionNode& right)
{
std::clog << "checkpoint addsimplify" << std::endl;
//simplest case: at least one side is just 0
if (left.getType() == NUMBER && left.getValue().getInt() == 0)
{
return right;
}
else if (right.getType() == NUMBER && right.getValue().getInt() == 0)
{
return left;
}
// for each left term: for each right term: try adding
std::stack <ExpressionNode*> leftNodeStack;
ExpressionNode * currentLeftNode = &left;
bool leftFinished = false;
std::stack <ExpressionNode*> rightNodeStack;
ExpressionNode * currentRightNode = &right;
bool rightFinished = false;
ExpressionNode * tempNodePtr;
ExpressionNode newNode;
while (leftFinished == false)
{
std::clog << "looping left" << std::endl;
if (currentLeftNode->getType() == OPERATION && currentLeftNode->getOperation() == &ADDITION)
{
if (currentLeftNode->getFirstChild() == 0)
{
throw ExpressionNode::WrongArityError();
}
currentLeftNode = currentLeftNode->getFirstChild();
leftNodeStack.push(currentLeftNode);
continue;
}
// leaf term on left tree: traverse right tree
while (rightFinished == false)
{
std::clog << "looping right" << std::endl;
if (currentRightNode->getType() == OPERATION && currentRightNode->getOperation() == &ADDITION)
{
if (currentRightNode->getFirstChild() == 0)
{
throw ExpressionNode::WrongArityError();
}
currentRightNode = currentRightNode->getFirstChild();
rightNodeStack.push(currentRightNode);
continue;
}
std::clog << "checkpoint addsimplify: before isAddable; " << std::endl;
// leaf terms on both sides: attempt adding
if (isAddable(*currentLeftNode, *currentRightNode))
{
std::clog << "checkpoint addsimplify: after isAddable; " << std::endl;
std::clog << *currentLeftNode << " " << *currentRightNode << std::endl;
std::clog << "add testrun: " << addTerms(*currentLeftNode, *currentRightNode);
(*currentLeftNode).replace( addTerms(*currentLeftNode, *currentRightNode) );
std::clog << "checkpoint addsimplify: after addTerms; " << std::endl;
if (currentRightNode == &right)
{
//entire right tree has been assimilated
return left;
}
tempNodePtr = currentRightNode;
currentRightNode = right.findParentOf(*currentRightNode);
right.remove(*tempNodePtr);
}
while (true)
{
if (rightNodeStack.size() == 0)
{
rightFinished = true;
break;
}
currentRightNode = rightNodeStack.top();
rightNodeStack.pop();
if (currentRightNode->getRight() != 0)
{
currentRightNode = currentRightNode->getRight();
rightNodeStack.push(currentRightNode);
break;
}
}
}
while (true)
{
if (leftNodeStack.size() == 0)
{
leftFinished = true;
break;
}
currentLeftNode = leftNodeStack.top();
//.........这里部分代码省略.........