Stack ve Queue: C ile Temel Veri Yapılarını Kodla

Stack (yığın) ve Queue (kuyruk) programlamada sıkça kullanılan iki temel veri yapısı. Stack LIFO (Last In First Out) mantığıyla çalışır, son giren ilk çıkar. Queue ise FIFO (First In First Out), ilk giren ilk çıkar. İkisini de C ile sıfırdan yazarak nasıl çalıştığını görelim.

Stack'i dizi tabanlı olarak oluşturalım. Eleman eklemek push, çıkarmak pop işlemidir.

1 <stdio.h>
2 <stdlib.h>
3 MAX 100
4
5typedef struct {
6int items[MAX];
7int top;
8} Stack;
9
10void push(Stack *s, int val) {
11if (s->top < MAX - 1) {
12s->items[++s->top] = val;
13printf("%d push edildi\n", val);
14} else {
15printf("Stack dolu!\n");
16}
17}
18
19int pop(Stack *s) {
20if (s->top >= 0) {
21return s->items[s->top--];
22}
23printf("Stack boş!\n");
24return -1;
25}
26
27int main() {
28Stack s;
29s.top = -1;
30
31push(&s, 10);
32push(&s, 20);
33push(&s, 30);
34
35printf("Pop: %d\n", pop(&s));
36printf("Pop: %d\n", pop(&s));
37
38return 0;
39}

Beklenen çıktı:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
110 push edildi
220 push edildi
330 push edildi
4Pop: 30
5Pop: 20

Şimdi Queue'yu yazalım. Enqueue (ekleme) ve Dequeue (çıkarma) işlemleri vardır.

1 <stdio.h>
2 <stdlib.h>
3 MAX 100
4
5typedef struct {
6int items[MAX];
7int front, rear;
8} Queue;
9
10void enqueue(Queue *q, int val) {
11if (q->rear < MAX - 1) {
12q->items[++q->rear] = val;
13printf("%d kuyruğa eklendi\n", val);
14} else {
15printf("Kuyruk dolu!\n");
16}
17}
18
19int dequeue(Queue *q) {
20if (q->front <= q->rear) {
21return q->items[q->front++];
22}
23printf("Kuyruk boş!\n");
24return -1;
25}
26
27int main() {
28Queue q;
29q.front = 0;
30q.rear = -1;
31
32enqueue(&q, 5);
33enqueue(&q, 15);
34enqueue(&q, 25);
35
36printf("Dequeue: %d\n", dequeue(&q));
37printf("Dequeue: %d\n", dequeue(&q));
38
39return 0;
40}

Beklenen çıktı:

15 kuyruğa eklendi
215 kuyruğa eklendi
325 kuyruğa eklendi
4Dequeue: 5
5Dequeue: 15

Stack'te son eklenen 30 ilk çıktı, Queue'da ise ilk eklenen 5 ilk çıktı. Fark budur. Gerçek projelerde dinamik bellek (malloc) kullanarak bağlı liste tabanlı versiyonlar daha verimli olur, ama bu temel yapılar algoritmayı anlamak için yeterli. Üretim kodunda buffer overflow'dan korunmak için her zaman sınır kontrolü yapın.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz