9d. Queues
2021-03-05
slides.com/jod/pt_9d
Docent: Jo Devriendt
Assistent: Ann Philips
Coördinator: Joost Vennekens
voornaam.achternaam@kuleuven.be
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Queue: twee operaties
- "Wachtrij"
- Put / enqueue: voeg toe aan het einde
- Get / dequeue: neem weg van het begin
void put(Queue* q, char c);
char get(Queue* q);
element 1
element 2
element 3
element 4
element 5
frame 4
frame 4
frame 4
frame 4
frame 4
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Implementatie via dynamische array
typedef struct {
int kop;
int staart;
int gereserveerd;
WAARDE* waardes;
} Queue;
Queue create() {
Queue q = {0, 0, 0, NULL};
return q;
}
void destroy(Queue* q){
if(q->waardes!=NULL){
free(q->waardes);
q->kop = 0;
q->staart = 0;
q->gereserveerd = 0;
q->waardes = NULL;
}
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Beoogde werking
element 1
element 2
?
typedef struct {
int kop; \\ 0
int staart; \\ 0
int gereserveerd; \\ 0
WAARDE* waardes; \\ NULL
} Queue;
typedef struct {
int kop; \\ 0
int staart; \\ 1
int gereserveerd; \\ 1
WAARDE* waardes; \\ ...
} Queue;
typedef struct {
int kop; \\ 0
int staart; \\ 2
int gereserveerd; \\ 3
WAARDE* waardes; \\ ...
} Queue;
typedef struct {
int kop; \\ 0
int staart; \\ 3
int gereserveerd; \\ 3
WAARDE* waardes; \\ ...
} Queue;
typedef struct {
int kop; \\ 1
int staart; \\ 3
int gereserveerd; \\ 3
WAARDE* waardes; \\ ...
} Queue;
typedef struct {
int kop; \\ 2
int staart; \\ 3
int gereserveerd; \\ 3
WAARDE* waardes; \\ ...
} Queue;
element 3
element 1
element 2
put
put
put
put
put
put
put
put
put
get
put
put
put
get
get
Indien voldoende elementen opgehaald, schuif array op en realloc
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Beoogde werking
element 3
typedef struct {
int kop; \\ 0
int staart; \\ 1
int gereserveerd; \\ 1
WAARDE* waardes; \\ ...
} Queue;
put
put
put
get
get
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Reserveer
void reserveer(Queue* q, int k){
q->waardes = realloc(q->waardes, sizeof(WAARDE)*k);
q->gereserveerd = k;
if(q->staart > k){
q->staart = k;
}
if(q->kop > k){
q->kop = k;
}
}
Zelfde idee als bij stack: reserveer meer dan nodig om niet voortdurend realloc te moeten oproepen
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Put
Identiek als stack, gebruik staart analoog aan lengte
void put(Queue* q, WAARDE x){
if(q->staart==q->gereserveerd){
reserveer(q, 2*q->gereserveerd+1);
}
q->waardes[q->staart]=x;
q->staart++;
}
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Get
int isLeeg(Queue* q){
return q->kop==q->staart;
}
WAARDE get(Queue* q){
WAARDE resultaat = q->waardes[q->kop];
q->kop++;
if(isLeeg(q) || q->kop > q->gereserveerd/2){
for(int i=q->kop; i<q->gereserveerd; ++i){
q->waardes[i-q->kop] = q->waardes[i];
}
q->staart -= q->kop;
q->kop = 0;
reserveer(q,q->gereserveerd/2);
}
return resultaat;
}
- Geef waarde vooraan terug, increment kop
- Als kop voldoende hoog is, schuif alle data terug naar voor en realloc
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Voorbeeld main
int main() {
Queue q = create();
Queue* qptr = &q;
put(qptr,'h');
printf("put %d %d %d\n", q.kop, q.staart, q.gereserveerd);
put(qptr,'e');
printf("put %d %d %d\n", q.kop, q.staart, q.gereserveerd);
put(qptr,'l');
printf("put %d %d %d\n", q.kop, q.staart, q.gereserveerd);
put(qptr,'l');
printf("put %d %d %d\n", q.kop, q.staart, q.gereserveerd);
while(!isLeeg(qptr)){
printf("get %c ",get(qptr));
printf("%d %d %d\n", q.kop, q.staart, q.gereserveerd);
}
put(qptr,'o');
printf("put %d %d %d\n", q.kop, q.staart, q.gereserveerd);
while(!isLeeg(qptr)){
printf("get %c ",get(qptr));
printf("%d %d %d\n", q.kop, q.staart, q.gereserveerd);
}
destroy(qptr);
}
$ ./a.out
put 0 1 1
put 0 2 3
put 0 3 3
put 0 4 7
get h 1 4 7
get e 2 4 7
get l 3 4 7
get l 0 0 3
put 0 1 3
get o 0 0 1
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Oefening
- Implementeer queue m.b.v. enkelgelinkte lijst
Programmeertechnieken [B-KUL-YI0855]
De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021
Samenvatting
-
Queue is een lineaire datastructuur met twee operaties
- put
- get
-
Implementatie kan met
- (dubbel)gelinkte lijst
- dynamische arrays
9d. Queues
By Jo Devriendt
9d. Queues
- 560