/* Stack a.k.a. LIFO http://en.wikipedia.org/wiki/Stack_(computing) (c) BruXy -- http://bruxy.regnet.cz/fel/ */ #include #include /********************* * Globalni promenne * *********************/ typedef struct stack{ int data; struct stack *odkaz; } STACK; /********************* * Funkce * *********************/ STACK *create(void){ STACK *test; test = ( (STACK *) malloc(sizeof(STACK)) ); if(test==NULL){ printf("Malo pameti!\n"); return NULL; } test->odkaz=NULL; return test; } /* Vrazi cislo do zasobniku a zvetsi ho o jeden prvek */ STACK *push(int cislo, STACK *stack) { STACK *s_novy; s_novy = create(); s_novy->data = cislo; s_novy->odkaz = stack; return s_novy; } /* Vymaze posledni cislo zasobniku a nastavi novou adresu vrcholu */ STACK *pop(STACK *stack) { STACK *s_temp; if(stack->odkaz==NULL){ printf("Zasobnik je prazdny!\n"); return NULL; } s_temp = stack; free(s_temp); return stack = stack->odkaz; } void free_data(STACK *stack){ for( ; stack->odkaz != NULL; stack = stack->odkaz) free(stack); return; } void print_data(STACK *stack){ for( ; stack->odkaz != NULL; stack = stack->odkaz) printf("%p = %d \n", (void *) stack, stack->data); return; } /********************* * Main * *********************/ int main(){ int cislo, size; int citac = 0; STACK *s_top; printf("Kolik prvku ma obsahovat stack?: "); scanf("%d", &size); /* Ukazatel na zacatek */ s_top = create(); /* Vsechny ukazuji na stejnou adresu */ for(;;) { if(citac == size) break; printf("Zadej cislo %d. : ", citac+1); scanf("%d", &cislo); printf("Ukladam %d na adresu %p.\n", cislo, (void *) s_top); s_top = push(cislo, s_top); printf("Addr -> %p.\n", (void *) s_top); putchar('\n'); citac++; } /* Vypsani obsahu celeho stacku */ printf("Vypis naplnenych dat.\n"); print_data(s_top); printf("\nKolik mam vymazat prvku?:"); scanf("%d", &cislo); citac = 0; for(;;) { if(citac == cislo) break; if(pop(s_top) != NULL) s_top = pop(s_top); else break; citac++; } print_data(s_top); /* Na zaver po sobe uklidime */ free_data(s_top); return 0; }