Stack and Queue


Apa itu Stack?

Stack adalah struktur data yang mengikuti prinsip Last-In-First-Out (LIFO). Dengan kata lain, elemen terakhir yang ditambahkan ke dalam stack akan menjadi yang pertama dihapus.


Apa itu Queue?

Queue adalah struktur data yang mengikuti prinsip First-In-First-Out (FIFO). Dengan kata lain, elemen pertama yang ditambahkan ke dalam queue akan menjadi yang pertama dihapus.


Notes

Stack

  • Stack adalah struktur data yang mengikuti prinsip Last-In-First-Out (LIFO).
  • Elemen terakhir yang ditambahkan ke dalam stack akan menjadi yang pertama dihapus.
  • Stack dapat diimplementasikan menggunakan array atau linked list.

Queue

  • Queue adalah struktur data yang mengikuti prinsip First-In-First-Out (FIFO).
  • Elemen pertama yang ditambahkan ke dalam queue akan menjadi yang pertama dihapus.
  • Queue dapat diimplementasikan menggunakan array atau linked list.

Ilustrasi


Stack Illustration

Berikut adalah contoh stack tumpukan buku yang berurutan dari 1 sampai 3, kita bisa lihat bahwa buku ke-3 ada di paling atas karena kita menaruh elemen di atas tumpukan,

stack visualization

Jika kita ingin menaruh elemen baru seperti buku ke-4 pada gambar,

stack visualization

Maka kita akan mendapatkan hasil stack sebagai berikut,

stack visualization

Lalu, kita akan membuang sebuah buku dari stack, maka kita harus membuang dari tempat teratas, tidak bisa dari bawah,

stack visualization

Hasil akhir ini memperlihatkan bahwa stack mempunyai prinsip Last-In-First-Out (LIFO), seperti pada tumpukan buku di dunia nyata.

stack visualization

Queue Illustration

Berikut contoh queue dari urutan 1 sampai 3, kita bisa melihat perbedaan dari stack dimana elemen nomor 1 berada di paling depan,

queue visualization

Elemen ke-4 akan menjadi elemen paling terakhir di antrian,

queue visualization

Jika kita menghapus elemen dari queue maka kita akan melihat urutan, yang paling awal masuk adalah yang paling pertama keluar, seperti antrian pada dunia nyata.

queue visualization

Hasil akhir dari queue adalah seperti ini, berbeda dari stack.

queue visualization

Implementasi


Stack Code

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

int stack[MAX_SIZE];
int top = -1;

// Fungsi untuk memeriksa apakah stack kosong
int is_empty() {
    return top == -1;
}

// Fungsi untuk memeriksa apakah stack penuh
int is_full() {
    return top == MAX_SIZE - 1;
}

// Fungsi untuk menambahkan elemen ke dalam stack
void push(int value) {
    if (is_full()) {
        printf("Stack overflow!\n");
        return;
    }
    stack[++top] = value;
}

// Fungsi untuk menghapus elemen dari stack
int pop() {
    if (is_empty()) {
        printf("Stack underflow!\n");
        return -1;
    }
    return stack[top--];
}

// Fungsi untuk menampilkan isi dari stack
void display() {
    int i;
    if (is_empty()) {
        printf("Stack is empty!\n");
        return;
    }
    for (i = top; i >= 0; i--) {
        printf("%d\n", stack[i]);
    }
}

int main() {
    push(10);
    push(20);
    push(30);
    printf("Is the stack full? %d\n", is_full());
    printf("Stack elements:\n");
    display();
    printf("Popped element: %d\n", pop());
    printf("Stack elements:\n");
    display();
    printf("Is the stack empty? %d\n", is_empty());
    return 0;
}

Output

Is the stack full? 0
Stack elements:
30
20
10
Popped element: 30
Stack elements:
20
10
Is the stack empty? 0

Queue Code

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

int queue[MAX_SIZE];
int front = -1, rear = -1;

// Fungsi untuk memeriksa apakah queue kosong
int is_empty() {
    return front == -1;
}

// Fungsi untuk memeriksa apakah queue penuh
int is_full() {
    return (front == 0 && rear == MAX_SIZE - 1) || (front == rear + 1);
}

// Fungsi untuk menambahkan elemen ke dalam queue
void enqueue(int value) {
    if (is_full()) {
        printf("Queue overflow!\n");
        return;
    }
    if (front == -1) {
        front = rear = 0;
    } else if (rear == MAX_SIZE - 1) {
        rear = 0;
    } else {
        rear++;
    }
    queue[rear] = value;
}

// Fungsi untuk menghapus elemen dari queue
int dequeue() {
    if (is_empty()) {
        printf("Queue underflow!\n");
        return -1;
    }
    int value = queue[front];
    if (front == rear) {
        front = rear = -1;
    } else if (front == MAX_SIZE - 1) {
        front = 0;
    } else {
        front++;
    }
    return value;
}

// Fungsi untuk menampilkan isi dari queue
void display() {
    int i;
    if (is_empty()) {
        printf("Queue is empty!\n");
        return;
    }
    if (front <= rear) {
        for (i = front; i <= rear; i++) {
            printf("%d\n", queue[i]);
        }
    } else {
        for (i = front; i <= MAX_SIZE - 1; i++) {
            printf("%d\n", queue[i]);
        }
        for (i = 0; i <= rear; i++) {
            printf("%d\n", queue[i]);
        }
    }
}

int main() {
    enqueue(10);
    enqueue(20);
    enqueue(30);
    printf("Is the queue full? %d\n", is_full());
    printf("Queue elements:\n");
    display();
    printf("Dequeued element: %d\n", dequeue());
    printf("Queue elements:\n");
    display();
    printf("Is the queue empty? %d\n", is_empty());
    return 0;
}

Output

Is the queue full? 0
Queue elements:
10
20
30
Dequeued element: 10
Queue elements:
20
30
Is the queue empty? 0