Struktur Data - Stacks

Stacks adalah struktur data dapat kita bayangkan berupa tumpukan. Misalnya tumpukan piring, kita menumpuk beberapa piring yang akan dicuci. Piring yang akan terambil lebih dulu adalah piring yang paling atas. Jadi, piring yang ditumpuk terakhir(paling atas) akan terambil duluan, atau yang biasa disebut dengan LIFO(Last In, First Out).


Terdapat dua fungsi utama pada stacks, yaitu Push & Pop. Push menaruh sebuah elemen pada bagian paling atas stacks, sedangkan Pop mengambil sebuah elemen yang berada paling atas pada stacks.


Cara mendefiniskan stacks yang menyimpan string
typedef struct
{
    // string pada stack sebanyak CAPACITY=4
    char* string[CAPACITY];

    // menandakan seberapa banyak string pada stack
    int size;
} stack;

// deklarasi variabel dengan tipe data stack sebagai variabel global
stack s; 
CAPACITY adalah sebuah konstanta yang didefinisikan dengan menggunakan #define

Ini adalah fungsi Push dengan nilai kembalian berupa boolean
bool push(char str[])
{
    // cek jika jumlah string pada stack sama dengan kapasitas stack
    if (s.size == CAPACITY)
    {
        // push gagal jika stack penuh
        return false;
    }

    // taruh string pada lokasi paling atas
    s.string[s.size] = str;

    // jumlah string pada stack bertambah jika push berhasil
    s.size++;

    // push berhasil
    return true;
}
Untuk Push sebuah elemen pada stacks, terlebih dahulu pastikan bahwa array tidak penuh dengan membandingkan size dan CAPACITY. Jika size lebih kecil dari CAPACITY, taruh elemen pada slot array yang masih tersedia di bagian paling atas, yang berarti pada indeks [size].

Ini adalah fungsi Pop dengan nilai kembalian berupa char* 
char* pop()
{
    // cek jika ada string pada stack
    if (s.size > 0)
    {
        // jika ada, kurangi jumlah string sebesar 1.
        // otomatis string yang paling atas akan hilang
        s.size--;

        // nilai kembalian berupa elemen terakhir pada stack
        return s.string[s.size];
    }
    return NULL;
}
Untuk Pop sebuah elemen dari stacks, terlebih dahulu pastikan bahwa ada sebuah elemen pada stacks (size > 0). Jika size > 0, maka kurangi nilai variabel size sebesar 1 dan jadikan elemen terakhir pada stack, yaitu pada indeks [size], menjadi nilai kembalian pada fungsi tersebut.

Program stack.c
#include <stdio.h>
#include <stdbool.h> // agar dapat menggunakan tipe data boolean

// mendefinisikan kapasitas stack hanya memuat 4 string
#define CAPACITY 4

typedef struct
{
    // string pada stack sebanyak CAPACITY=4
    char* string[CAPACITY];

    // menandakan seberapa banyak string pada stack
    int size;
} stack;

// deklarasi variabel dengan tipe data stack sebagai variabel global
stack s;

/**
 * Stack adalah struktur data yang berbentuk tumpukan(stack=tumpukan).
 * Misalnya kita menumpuk piring-piring, piring yang kita tumpuk terakhir
 * akan terambil paling awal.
 * Konsep ini diimplementasi dengan fungsi yang secara umum bernama Push dan Pop.
 * Push adalah ketika kita menumpuk piring tersebut, sedangkan pop adalah ketika
 * kita mengambil piring paling atas.
 * Stack menggunakan konsep LIFO(last in, first out).
 */
bool push(char str[])
{
    // cek jika jumlah string pada stack sama dengan kapasitas stack
    if (s.size == CAPACITY)
    {
        // push gagal jika stack penuh
        return false;
    }

    // taruh string pada lokasi paling atas
    s.string[s.size] = str;

    // jumlah string pada stack bertambah jika push berhasil
    s.size++;

    // push berhasil
    return true;
}

char* pop()
{
    // cek jika ada string pada stack
    if (s.size > 0)
    {
        // jika ada, kurangi jumlah string sebesar 1.
        // otomatis string yang paling atas akan hilang
        s.size--;

        // nilai kembalian berupa elemen terakhir pada stack
        return s.string[s.size];
    }
    return NULL;
}

int main()
{
    // inisialisasi jumlah string pada stack menjadi 0
    s.size = 0;

    char* data;
    int pilihan;
    while (true)
    {
        printf("1. Push\n2. Pop\n3. Display Size\n4. Quit\nJawab: ");
        scanf("%d", &pilihan);
        switch (pilihan)
        {
            case 1:
               printf("Insert string: ");
               scanf("%s", &data);
               printf("The push %s successful\n", (push(data))?"was":"was not");
               break;
            case 2: pop(); break;
            case 3: printf("Size = %d\n", s.size); break;
            default: return 0; break;
        }
    }
}




-----------------------------------------------------------------------
Reference:
https://study.cs50.net/stacks

Post a Comment