#include #include typedef struct cell { int val; struct cell *next; } Cell, *Stack; Stack stack = NULL; Cell *cons(int val,Cell *next) { Cell *r; r = (Cell *)malloc(sizeof(Cell)); if ( r == NULL) { fprintf(stderr,"Plus de memoire\n"); exit(-1); } r->val = val; r->next = next; return r; } void afficher(void) { Stack p; printf("["); for (p=stack ; p != NULL ; p = p->next) { printf("%d",p->val); if (p->next != NULL) printf(", "); } printf("]"); } int pop(void) { int r; if (stack == NULL) { fprintf(stderr,"Tentative de depiler une pile vide, adieu\n"); exit(-1); } r = stack->val; stack = stack->next; return r; } void push(i) { stack = cons(i,stack); } void swap(void) { int t; if (stack == NULL || stack->next == NULL) return; t = stack->val; stack->val = stack->next->val; stack->next->val = t; return; } void down(void) { Stack p,q; if (stack == NULL) return; for (p = stack ; p->next->next != NULL ; p = p->next) ; q = p->next; p->next = NULL; q->next = stack; stack = q; } void up(void) { Stack p,q; if (stack == NULL || stack->next == NULL) return; for (p = stack ; p->next != NULL ; p = p->next) ; q = stack; stack = stack->next; q->next = NULL; p->next = q; } void main(void) { int do_print; int c; int r1; printf(" "); afficher(); printf("\n"); while ((c = getchar()) != EOF) { do_print=1; switch (c) { case '+': push(pop()+pop()); break; case '-': r1 = pop(); push(pop()-r1); break; case '*': push(pop()*pop()); break; case '/': r1 = pop(); push(pop()/r1); break; case 's': swap(); break; case 'd': down(); break; case 'u': up(); break; default: if ('0' <= c && c <= '9') push(c - '0'); else do_print=0; } if (do_print) { printf("%c : ",c); afficher(); printf("\n"); } } }