You are on page 1of 16

3.

laboratorijske vjebe
Stog i red pomou statikih polja

Zadaci s laboratorijskih vjebi


1. Stog pomou statikog polja.
2. Red pomou statikog polja.

2/16

1. Stog zadatak
Realizirati stog u koji se pohranjuje niz cijelih brojeva i pripadajue funkcije za
(d)odavanje, (b)risanje te (i)spis svih elemenata. Inicijalna velicina polja je 3.
Osigurati stog od brisanja elementa ako je prazan i dodavanja ako je pun.
Ukoliko se program pozove s opcijom -d uiniti stog dinamikim. U trenutku
kada se dodaje novi element u popunjeni stog potrebno je osigurati dodatni
prostor i to za 3 dodatna elementa.

3/16

1. Stog: inicijalizacija
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 3
#define GROW_BY 3

4/16

1. Stog: main
int main(int argc, char *argv[]) {
char menu_choice;
int val, current_size, retval, *stack, top=-1, is_dynamic=0;
if (argc > 1 && !strcmp(argv[1], "-d")) is_dynamic = 1;
stack = (int *)malloc(sizeof(int) * SIZE);
current_size = SIZE;
printf("\n(d) dodaj - push\n(b) brisi - pop\n(i) ispis - print\n(e) Exit\n");
do {
scanf(" %c", &menu_choice);
switch (menu_choice) {
case 'd':
scanf("%d", &val);
retval = push(&stack, &top, &current_size, val, is_dynamic);
if (retval==1) printf("Stog je pun. Alocirao sam dodatni prostor.\n");
else if (retval==-1) printf("Stog je pun. Ne mogu dodati element.\n");
break;
case 'b':
retval = pop(&top);
if (retval==-1) printf("Stog je prazan. Ne mogu obrisati element.\n");
break;
case 'i':
print(stack, top);
break;
}
} while(menu_choice!='e');
free(stack);
return 0;
}

5/16

Komentar: argumenti programa


find . -size +1k

-iname "*.c"

int main(int argc, char *argv[])


find . -size +1k

f i n d \0

argc

. \0

-iname "*.c"

- s i z e \0

+ 1 k \0

- i n a m e \0

" * . c " \0

argv

NULL

argc - broj argumenata


argv - pokaziva na polje pokazivaa
Koritenje argumenata:
if(argc > 1 && !strcmp(argv[1], "-d")) is_dynamic = 1;

6/16

Komentar: polje i pointer


int stack_arr[8];

int *stack_ptr;
stack_ptr = (int *) malloc(8*sizeof(int));

stack_arr i stack_ptr su funkcionalno isti jer:


oba su pokazivai na memorijsku lokaciju na kojoj se nalazi prvi element
polja odnosno poetak alociranog prostora i preko oba mozemo pristupati
elementima koristei indeks stack[index]
Razlike:
stack_arr ne moemo mijenjati, on uvijek pokazuje na prvi element, dok je
stack_ptr regularan pokaziva
memorijska lokacija na koju pokazuje stack_ptr je na gomili te se nakon
koritenja mora osloboditi zvanjem free(stack_ptr) dok stack_arr
pokazuje na lokaciju na programskom stogu koja se oslobaa automatski
povratkom iz funkcije
prilikom zvanja naredbe free stack_ptr mora obavezno pokazivati na
mjesto na koje je pokazivao kada smo memoriju alocirali
7/16

1. Stog: Push
int push(int **stack, int *top, int *current_size, int val, int is_dynamic) {
int retval = 0;
if (*top==*current_size-1) {
if(is_dynamic==1) {
*stack = (int *) realloc(*stack, sizeof(int)*(*current_size+GROW_BY));
if(!(*stack)) return -1;
*current_size += GROW_BY;
retval = 1;
} else {
return -1;
}
}
(*top)++;
(*stack)[*top] = val;
return retval;
}

8/16

1. Stog: Pop
int pop(int *top) {
if (*top==-1) return -1;
(*top)--;
return 0;
}

9/16

1. Stog: Print
int print(int stack[], int top) {
int i;
printf("Stog:\t");
for (i=0; i<=top; i++) {
printf("%d\t", stack[i]);
}
printf("\n");
return 0;
}

10/16

2. Red zadatak
Realizirati red u koji se pohranjuje niz cijelih brojeva koristei statiko polje
veliine 8. Pobrinuti se za ispravnu dojavu pogreke u sluajevima kada se eli
uzeti element iz praznog reda ili dodati element u red u trenutku kada je polje
popunjeno. Koritenje je slino primjeru u prvom zadatku.

11/16

2. Red: inicijalizacija
#include <stdio.h>
#include <stdlib.h>
#define SIZE 8

12/16

2. Red: main
int main() {
char menu_choice;
int val, retval, *queue, head=0, tail=0;
queue = (int *)malloc(sizeof(int) * SIZE);
printf("\n(d) dodaj - enqueue\n(b) brisi - dequeue\n(i) ispis - print\n(e) Exit\n");
do {
scanf(" %c", &menu_choice);
switch (menu_choice) {
case 'd':
scanf("%d", &val);
retval = enqueue(queue, head, &tail, val);
if (retval==-1) printf("Red je pun.\n");
break;
case 'b':
printf("Brisem element %d.\n", queue[head]);
retval = dequeue(queue, &head, tail);
if (retval==-1) printf("Red je prazan.\n");
break;
case 'i':
print(queue, head, tail);
break;
}
} while(menu_choice!='e');
free(queue);
return 0;
}

13/16

2. Red: Enqueue
int enqueue(int queue[], int head, int *tail, int val) {
if ((*tail+1)%SIZE==head) return -1; // red je pun
queue[*tail] = val;
*tail = (*tail+1)%SIZE;
return 0;
}

14/16

2. Red: Dequeue
int dequeue(int queue[], int *head, int tail) {
if (*head==tail) return -1; // red je prazan
*head = (*head + 1)%SIZE;
return 0;
}

15/16

2. Red: Print
int print(int queue[], int head, int tail) {
int i;
if (tail==head) {
printf("Red je prazan.\n");
return -1;
}
printf("Red:\t");
for (i=head; i!=tail; i=(i+1)%SIZE) {
printf("%d\t", queue[i]);
}
printf("\n");
printf("head: %d\n", head);
printf("tail: %d\n", tail);
return 0;
}

16/16

You might also like