53 lines
1.6 KiB
C
53 lines
1.6 KiB
C
|
|
#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='x',
|
|
Div='/',
|
|
End='\0' /* Only for "printf" */
|
|
} OPER;
|
|
|
|
typedef struct stackelt {
|
|
int val;
|
|
int nop; /* number of operators */
|
|
int curop; /* current operator */
|
|
char op[MAXINPUT]; /* MAXINPUT-1 + ending \0 */
|
|
int next, prev; /* for eval: avoids restructuring stack */
|
|
} STACKELT;
|
|
|
|
typedef struct stack {
|
|
char name[80];
|
|
int size;
|
|
int last;
|
|
int eval;
|
|
STACKELT *stack;
|
|
} STACK;
|
|
|
|
/* tree.c */
|
|
extern void gen_tree(int *seq, int n, int nb1, int nb0);
|
|
|
|
/* stack.c */
|
|
extern void print_stack(STACK *stack, int details);
|
|
extern STACK *new_stack(int size, char *name);
|
|
extern STACKELT *push_stack(STACK *stack, OPER op, int val);
|
|
extern STACKELT *pop_stack(STACK *stack);
|
|
extern STACK *dup_stack(STACK *stack, char *name);
|
|
extern void swap_stack(STACKELT *elts, int i, int j);
|
|
extern int permute_stack(STACKELT *array, int n);
|
|
extern void mergesort_stack(STACKELT *array, int left, int right);
|
|
extern STACKELT *set_op_stack(STACK *stack, int pos, OPER op);
|
|
extern STACKELT *set_ops_stack(STACK *stack, char *ops);
|
|
|
|
/* oper.c */
|
|
extern unsigned ncombinations(int nops, int len);
|
|
extern char *combination(char *ops, int len, int n);
|
|
|
|
/* eval.c */
|
|
extern int eval_cell(STACKELT *pos);
|
|
extern int eval_stack(STACK *stack);
|