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