#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// Struktur stack
#define MAX 100

typedef struct {
    char data[MAX];
    int top;
} Stack;

// Fungsi untuk inisialisasi stack
void initStack(Stack *s) {
    s->top = -1;
}

// Fungsi untuk mengecek apakah stack penuh
int isFull(Stack *s) {
    return s->top == MAX - 1;
}

// Fungsi untuk mengecek apakah stack kosong
int isEmpty(Stack *s) {
    return s->top == -1;
}

// Fungsi untuk memasukkan elemen ke dalam stack
void push(Stack *s, char c) {
    if (isFull(s)) {
        printf("Stack penuh!\n");
        return;
    }
    s->data[++s->top] = c;
}

// Fungsi untuk mengeluarkan elemen dari stack
char pop(Stack *s) {
    if (isEmpty(s)) {
        printf("Stack kosong!\n");
        return -1;  // Mengembalikan nilai invalid jika stack kosong
    }
    return s->data[s->top--];
}

// Fungsi untuk membalikkan string menggunakan stack
void reverseString(char *str) {
    Stack s;
    initStack(&s);
    
    // Menyimpan setiap karakter string ke dalam stack
    for (int i = 0; str[i] != '\0'; i++) {
        push(&s, str[i]);
    }
    
    // Mengambil karakter dari stack dan menuliskannya kembali ke string
    int i = 0;
    while (!isEmpty(&s)) {
        str[i++] = pop(&s);
    }
}

int main() {
    char str[MAX];
    
    printf("Masukkan string: ");
    fgets(str, sizeof(str), stdin);
    
    // Menghapus newline karakter jika ada
    str[strcspn(str, "\n")] = 0;
    
    reverseString(str);
    
    printf("String setelah dibalik: %s\n", str);
    
    return 0;
}
