#include #define MAXINPUT 6 /* max numbers as input */ #define ALLOCSIZE 1024 /* # of elements to alloc when needed */ #define EMPTY -1 typedef enum { Nop='N', Add='+', Sub='-', Mul='*', Div='/', End='\0' /* Only for "printf" */ } OPER; typedef struct stack { char name[80]; int size; int last; struct stack *next; int stack[MAXINPUT+1]; } STACK; #define TREE_UNDEF (-1) /* should not happen */ #define TREE_LEAF 0 #define TREE_NODE 1 #define TREE_LEFT 'L' #define TREE_RIGHT 'R' #define TREE_TOP 'T' #define EMPTY -1 typedef struct node { int type; /* TREE_LEAF or TREE_NODE */ int op; int val; int eval; struct node *left; struct node *right; struct node *next; /* for transversal walk and free nodes */ } NODE; typedef struct tree { char name[80]; NODE *head; struct tree *next; int nodes; /* number of nodes */ int leaves; /* number of leaves */ int depth; /* max depth */ } TREE; typedef struct best { int res; int diff; int nops; char *oper; NODE *root; int *values; struct timespec timer; } BEST; /* tree.c */ extern NODE *get_node(); extern void free_node(NODE *node); extern void print_node(NODE *node, char side, int depth, int details); extern void print_tree(TREE *tree, int details); extern void print_trees(int details); extern TREE *new_tree(char *name); extern NODE *dup_node(NODE *src); extern NODE *build_tree(int *desc, int size); extern void gen_tree(int *seq, int n, int nb1, int nb0); extern TREE *nth_tree(int n); extern int n_trees(); /* stack.c */ extern void print_stack(STACK *stack, int details); extern void print_stacks(); extern int keep_stack(STACK *stack); //extern STACK *new_stack(int size, char *name, int keep); extern STACK *new_stack(int size, char *name, int keep); extern int *push_stack(STACK *stack, int val); extern int *pop_stack(STACK *stack); extern STACK *dup_stack(STACK *stack, char *name); extern void swap_stack(int *elts, int i, int j); extern int permute_stack(int *array, int n); extern int gen_stacks(STACK *stack); extern void mergesort_stack(int *array, int left, int right); extern STACK *nth_stack(int n); extern int n_stacks(); // extern STACKELT *set_op_stack(STACK *stack, int pos, OPER op); // extern STACKELT *set_ops_stack(STACK *stack, char *ops); /* oper.c */ extern void print_comb(int n); extern void print_combs(); //extern unsigned n_combine(int nops, int len); //extern char *combine(char *ops, int len, int n); extern void gen_combinations(int nops); extern int n_combs(); extern char *nth_comb(int n); /* eval.c */ /* stack version */ //extern int eval_cell(STACKELT *pos); //extern int eval_stack(STACK *stack); /* tree version */ extern int eval_node(NODE *node, int depth, int *pvals, char *pops, int *ncalcs); extern int get_totnodes(); extern int get_totleaves(); /* best.c */ extern int stopped(); extern void set_target (int n); extern int check_best(int res, int nops, NODE *node, int *values, char *ops); extern void print_best(NODE *node, int *values, char *pops, int depth); extern void print_bests(); /* timer.c */ extern int sigint_received; extern void start_timer(); extern void set_timer(struct timespec *timer); extern double get_timer(struct timespec timer);