Knižnica pre zásobník
Dopracujte do knižnice pre zásobník operácie pre push a pop
Upratovanie v projekte
- Odsuňme všetky projektové súbory do separátneho adresára (
zasobnik_projekt
)- hlavičkový súbor
zasobnik.h
- knižnica
zasobnik.c
- demo
zasobnik_demo.c
- hlavičkový súbor
Je to kvôli separátnemu makefile
.
Separátny makefile
Založme si makefile
, ktorým budeme kompilovať projekt.
CC=gcc
CFLAGS=-Wall -Wextra -ansi -pedantic -Werror -lm
zasobnik_demo: zasobnik.c
- Zápis hovorí: cieľ
zasobnik_demo
potrebuje na svoju realizáciu súborzasobnik.c
. - Vďaka implicitným pravidlám nástroja
make
sa automaticky zistí, že na cieľzasobnik_demo
, ktorý je zároveň názvom výslednej binárky, treba tiež súborzasobnik_demo.c
. Ak zavoláme:
make
vykoná sa:
gcc -Wall -Wextra -ansi -pedantic -Werror -lm zasobnik_demo.c zasobnik.c -o zasobnik_demo
Funkcia pre push
Do hlavičkového súboru dodáme funkciu:
int push(ZASOBNIK * zasobnik, char c);
Implementácia bude:
int push(ZASOBNIK * zasobnik, char c) {
struct polozka * p = malloc(sizeof(struct polozka ));
if( p == NULL ) {
return -1;
}
p->znak = c;
p->dalsi = *zasobnik;
*zasobnik = p;
return 0;
}
- Pozor na fakt, že funkcia mení celý zásobník! (Pridáva na jeho začiatok nové prvky.)
- Ak funkcia mení svoj parameter a chceme, aby sa zmeny udržali aj po jej ukončení, musíme využiť odovzdávanie odkazom.
- Parameter
zasobnik
bude odovzdávaný odkazom cez pointer. V deme potom pristupujeme k funkcii cez zásobník odovzdávaný odkazom. Využijeme operátor referencie, ampersand, ktorý pre danú premennú vráti jej adresu v pamäti. Túto adresu môžeme využiť ako pointer.
Volanie funkcie bude:
push(&z, 'A');
Celý kód:
#include<stdio.h> #include"zasobnik.h" int main() { ZASOBNIK z = stack_new(); push(&z, 'A'); /* ... */* }
Funkcia pre pop
Do hlavičkového súboru dodáme funkciu:
char pop(ZASOBNIK * zasobnik);
Opäť vieme, že funkcia mení celý zásobník (odoberá prvok) a preto ho odovzdajme odkazom.
Implementácia v súbore
zasobnik.c
:char pop(ZASOBNIK * zasobnik) { char c; struct polozka * p; if(stack_empty(*zasobnik)) { return '\0'; } p = *zasobnik; c = (*zasobnik)->znak; (*zasobnik) = (*zasobnik)->dalsi; free(p); p = NULL; return c; }
Demo kód bude vyzerať:
#include<stdio.h>
#include"zasobnik.h"
int main() {
ZASOBNIK z = stack_new();
push(&z, 'A');
push(&z, 'H');
push(&z, 'O');
push(&z, 'J');
if(stack_empty(z)) {
puts("Zasobnik je prazdny");
} else {
puts("Zasobnik NIE JE prazdny");
}
printf("%c", pop(&z));
printf("%c", pop(&z));
printf("%c", pop(&z));
printf("%c", pop(&z));
printf("%c", pop(&z));
return 0;
}
Zdroje
- C, vlastný zásobník a kontrola zátvoriek — podrobný článok o implementácii zásobníka.
- Function calls: pass by value / pass by reference, XL C/C++ V8.0 for AIX