struct math_node *treeify(struct math_node **stack, int *size) { if (!stack || !size) { return 0; } struct math_node *parent; (*size)--; parent = *(stack + *size); if (*(parent->op) == '-' && *(parent->op + 1) >= 48 && *(parent->op + 1) <= 57) { return parent; } if (isOperator(parent->op)) { parent->right = treeify(stack, size); parent->left = treeify(stack, size); } return parent; }
int main() { int i; char buffer[101]; struct math_node **stack; int stack_size; struct math_node *tree; // get string printf("Enter the postfix expression to be evaluated: "); fgets(buffer, 100, stdin); // stackify stack = stackify(buffer, &stack_size); // test stackify: // printf("stack_size:%i\n", stack_size); // for (i=0; i<stack_size; i++) { // printf("%s\n", (*(stack + i))->op); // } // treeify tree = treeify(stack, &stack_size); // evaluate the tree int value; value = evaluate_tree(tree); printf("The tree evaluates to: %d\n", value); // print various forms char* exp; int length; length = 0; exp = getexp_prefix(tree, &length); printf("Prefix Notation: %s\n", exp); free(exp); exp = 0; length = 0; exp = getexp_infix(tree, &length); printf("Infix Notation: %s\n", exp); free(exp); exp = 0; length = 0; exp = getexp_postfix(tree, &length); printf("Postfix Notation: %s\n", exp); free(exp); exp = 0; // cleanup tree_destructor(tree); free(stack); stack = 0; return 0; }
QueryOperator * rewriteProvenanceComputation (ProvenanceComputation *op) { // for a sequence of updates of a transaction merge the sequence into a single // query before rewrite. if (op->inputType == PROV_INPUT_UPDATE_SEQUENCE || op->inputType == PROV_INPUT_TRANSACTION) { START_TIMER("rewrite - merge update reenactments"); mergeUpdateSequence(op); STOP_TIMER("rewrite - merge update reenactments"); // need to restrict to updated rows? if (op->inputType == PROV_INPUT_TRANSACTION && HAS_STRING_PROP(op,PROP_PC_ONLY_UPDATED)) { START_TIMER("rewrite - restrict to updated rows"); restrictToUpdatedRows(op); STOP_TIMER("rewrite - restrict to updated rows"); } } if (isRewriteOptionActivated(OPTION_TREEIFY_OPERATOR_MODEL)) { treeify((QueryOperator *) op); INFO_LOG("treeifyed operator model:\n\n%s", operatorToOverviewString((Node *) op)); DEBUG_LOG("treeifyed operator model:\n\n%s", beatify(nodeToString(op))); ASSERT(isTree((QueryOperator *) op)); } switch(op->provType) { case PROV_PI_CS: if (isRewriteOptionActivated(OPTION_PI_CS_USE_COMPOSABLE)) return rewritePI_CSComposable(op); else return rewritePI_CS(op); case PROV_TRANSFORMATION: return rewriteTransformationProvenance((QueryOperator *) op); } return NULL; }