Professional Documents
Culture Documents
laboratorijske vjebe
Stog i red pomou statikih 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, ¤t_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
-iname "*.c"
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
6/16
int *stack_ptr;
stack_ptr = (int *) malloc(8*sizeof(int));
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