Tuesday, May 12, 2026

Penggunaan Tree

 






Studi Kasus 1 — Sistem Folder Komputer 

Buatlah aplikasi simulasi sistem folder komputer menggunakan struktur data Tree.

Aplikasi harus mampu:

  • Membuat folder baru
  • Menghapus folder
  • Menampilkan struktur direktori
  • Mencari folder tertentu
  • Menghitung jumlah folder
  • Menampilkan path lengkap suatu folder

Ketentuan

  • Gunakan struktur Tree non-binary (General Tree)
  • Setiap node merepresentasikan folder
  • Implementasikan traversal:
    • Preorder
    • Postorder
  • Gunakan bahasa C++
  • Tampilkan hasil dalam bentuk hierarki seperti sistem operasi



Referensi


Pengumpulan Tugas


Absensi





Tuesday, May 5, 2026

Tree

 



Definisi Tree

Tree (pohon) adalah struktur data non-linear yang berbentuk hierarki dan terdiri dari kumpulan elemen yang disebut node (simpul). Setiap node dalam tree dihubungkan oleh garis yang disebut edge (sisi), yang bisa bersifat terarah (directed) maupun tidak terarah (undirected).

Pada ilustrasi:

  • Lingkaran = Node
  • Garis penghubung = Edge

Mengapa Tree Dibutuhkan dalam Struktur Data?

Struktur data seperti:

  • Array
  • Linked List
  • Stack
  • Queue

merupakan struktur data linear, di mana data disimpan secara berurutan.

Kelemahan Struktur Linear:

  • Operasi seperti insert dan delete semakin lambat ketika data besar
  • Kompleksitas waktu meningkat (kurang efisien untuk data besar)

Keunggulan Tree:

  • Struktur non-linear → lebih fleksibel
  • Proses:
    • Penyimpanan data lebih efisien
    • Akses data lebih cepat
    • Manipulasi data lebih optimal
  • Mendukung teknik traversal (penelusuran) seperti:
    • Preorder
    • Inorder
    • Postorder

Latihan


Pengumpulan Tugas

Absensi



Tuesday, April 21, 2026

Linked List

 



Linked List

Linked List adalah struktur data yang terdiri dari kumpulan objek yang disebut node, yang tersimpan secara tidak berurutan (tidak bersebelahan) di dalam memori.

Berbeda dengan array, elemen pada linked list tidak harus berada pada alamat memori yang berdekatan

Struktur Node pada Linked List

Setiap node dalam linked list memiliki dua bagian utama, yaitu:

  1. Data
    • Berisi nilai atau informasi yang disimpan pada node tersebut.
  2. Pointer (Next)
    • Berisi alamat memori dari node berikutnya dalam list.

Node Terakhir

Node terakhir dalam linked list memiliki ciri khusus:

  • Pointer-nya tidak menunjuk ke node lain
  • Biasanya berisi nilai NULL

Artinya, node tersebut adalah akhir dari linked list

 

Implementasi dalam C++

#include <iostream>

using namespace std;

// Struktur Node
struct Node {
    int data;
    Node* next;
};

int main() {
    // Membuat 3 node
    Node* node1 = new Node();
    Node* node2 = new Node();
    Node* node3 = new Node();

    // Isi data
    node1->data = 10;
    node2->data = 20;
    node3->data = 30;

    // Hubungkan node
    node1->next = node2;
    node2->next = node3;
    node3->next = NULL;

    // Traversal (menampilkan data)
    Node* current = node1;
    while (current != NULL) {
        cout << current->data << " -> ";
        current = current->next;
    }
    cout << "NULL";

    return 0;
}



Referensi 


Tuesday, April 14, 2026

Queue





Queue (Antrian) adalah struktur data linear yang merupakan kumpulan elemen. Queue adalah jenis khusus dari list, di mana elemen dimasukkan pada satu ujung yang disebut rear (belakang) dan dihapus dari ujung lainnya yang disebut front (depan).

Prinsip utama dari queue adalah FIFO (First-In-First-Out) atau masuk pertama, keluar pertama.

Queue merupakan struktur data abstrak (Abstract Data Type / ADT) dan sangat berguna dalam pemrograman. Konsepnya mirip dengan antrian tiket di depan bioskop, di mana orang yang pertama kali masuk antrian adalah orang pertama yang mendapatkan tiket.

Contoh dalam kehidupan nyata lainnya adalah jalan satu arah satu jalur, di mana kendaraan yang masuk terlebih dahulu akan keluar terlebih dahulu.

Operasi utama:

  • enqueue() → tambah data
  • dequeue() → hapus data
Proses
ALGORITHM Enqueue(Q, item)
INPUT    : Q (queue), item (elemen yang akan dimasukkan)
OUTPUT   : Queue Q yang telah ditambahkan elemen baru

BEGIN
    IF rear = MAX - 1 THEN
        OUTPUT "Queue Overflow"
        RETURN
    ENDIF

    IF front = -1 THEN
        front ← 0
        rear  ← 0
    ELSE
        rear ← rear + 1
    ENDIF

    Q[rear] ← item

END

Penjelasan Variabel

  • Q : array sebagai penyimpan queue
  • MAX : kapasitas maksimum queue
  • front : penunjuk elemen depan
  • rear : penunjuk elemen belakang
  • item : data yang akan dimasukkan

DEQUEUE

ALGORITHM Dequeue(Q)
INPUT    : Q (queue)
OUTPUT   : Elemen yang dihapus dari queue

BEGIN
    IF front = -1 THEN
        OUTPUT "Queue Underflow"
        RETURN
    ENDIF

    item ← Q[front]

    IF front = rear THEN
        front ← -1
        rear  ← -1
    ELSE
        front ← front + 1
    ENDIF

    RETURN item

END

Contoh :

  • Antrian bank
  • Printer queue
  • Task scheduling OS

  • Implementasi Array


    #include <iostream>
    using namespace std;

    #define MAX 5

    class Queue {
    private:
        int arr[MAX];
        int front, rear;

    public:
        Queue() {
            front = -1;
            rear = -1;
        }

        bool isEmpty() {
            return (front == -1);
        }

        bool isFull() {
            return (rear == MAX - 1);
        }

        void enqueue(int x) {
            if (isFull()) {
                cout << "Queue Overflow\n";
                return;
            }
            if (isEmpty()) {
                front = 0;
            }
            arr[++rear] = x;
            cout << "Elemen " << x << " masuk ke queue\n";
        }

        void dequeue() {
            if (isEmpty()) {
                cout << "Queue Underflow\n";
                return;
            }
            cout << "Elemen " << arr[front] << " keluar dari queue\n";
            if (front == rear) {
                front = rear = -1;
            } else {
                front++;
            }
        }

        void display() {
            if (isEmpty()) {
                cout << "Queue kosong\n";
                return;
            }
            cout << "Isi Queue: ";
            for (int i = front; i <= rear; i++) {
                cout << arr[i] << " ";
            }
            cout << endl;
        }
    };

    int main() {
        Queue q;

        q.enqueue(10);
        q.enqueue(20);
        q.enqueue(30);

        q.display();

        q.dequeue();
        q.display();

        return 0;
    }

    Implementasi Link List


    #include <iostream>
    using namespace std;

    struct Node {
        int data;
        Node* next;
    };

    class Queue {
    private:
        Node *front, *rear;

    public:
        Queue() {
            front = rear = NULL;
        }

        bool isEmpty() {
            return (front == NULL);
        }

        void enqueue(int x) {
            Node* newNode = new Node();
            newNode->data = x;
            newNode->next = NULL;

            if (rear == NULL) {
                front = rear = newNode;
            } else {
                rear->next = newNode;
                rear = newNode;
            }
            cout << "Elemen " << x << " masuk ke queue\n";
        }

        void dequeue() {
            if (isEmpty()) {
                cout << "Queue kosong\n";
                return;
            }

            Node* temp = front;
            cout << "Elemen " << temp->data << " keluar dari queue\n";

            front = front->next;

            if (front == NULL) {
                rear = NULL;
            }

            delete temp;
        }

        void display() {
            if (isEmpty()) {
                cout << "Queue kosong\n";
                return;
            }

            Node* temp = front;
            cout << "Isi Queue: ";
            while (temp != NULL) {
                cout << temp->data << " ";
                temp = temp->next;
            }
            cout << endl;
        }
    };

    int main() {
        Queue q;

        q.enqueue(5);
        q.enqueue(15);
        q.enqueue(25);

        q.display();

        q.dequeue();
        q.display();

        return 0;
    }

    Monday, April 6, 2026

    Studi Kasus Stack

     




    Konversi ke Postfix




    #include <iostream>
    #include <stack>
    #include <string>
    #include <cctype>
    using namespace std;

    // Fungsi untuk menentukan prioritas operator
    int precedence(char op) {
        if (op == '^')
            return 3;
        else if (op == '*' || op == '/')
            return 2;
        else if (op == '+' || op == '-')
            return 1;
        else
            return 0;
    }

    // Fungsi untuk cek apakah karakter adalah operator
    bool isOperator(char c) {
        return (c == '+' || c == '-' || c == '*' || c == '/' || c == '^');
    }

    // Fungsi utama konversi infix ke postfix
    string infixToPostfix(string infix) {
        stack<char> st;
        string postfix = "";

        for (int i = 0; i < infix.length(); i++) {
            char c = infix[i];

            // Jika operand (huruf/angka)
            if (isalnum(c)) {
                postfix += c;
            }
            // Jika '('
            else if (c == '(') {
                st.push(c);
            }
            // Jika ')'
            else if (c == ')') {
                while (!st.empty() && st.top() != '(') {
                    postfix += st.top();
                    st.pop();
                }
                if (!st.empty())
                    st.pop(); // hapus '('
            }
            // Jika operator
            else if (isOperator(c)) {
                while (!st.empty() && precedence(st.top()) >= precedence(c)) {
                    postfix += st.top();
                    st.pop();
                }
                st.push(c);
            }
        }

        // Pop semua operator tersisa
        while (!st.empty()) {
            postfix += st.top();
            st.pop();
        }

        return postfix;
    }

    // Main function
    int main() {
        string infix;

        cout << "Masukkan ekspresi infix: ";
        cin >> infix;

        string postfix = infixToPostfix(infix);

        cout << "Postfix: " << postfix << endl;

        return 0;
    }

    Evaluasi Postfix






    #include <iostream>
    #include <stack>
    #include <cctype>
    using namespace std;

    // Fungsi evaluasi postfix
    int evaluatePostfix(string exp) {
        stack<int> st;

        for (char c : exp) {

            // Jika operand (angka)
            if (isdigit(c)) {
                st.push(c - '0'); // konversi char ke int
            }
            // Jika operator
            else {
                int val2 = st.top(); st.pop();
                int val1 = st.top(); st.pop();

                switch (c) {
                    case '+': st.push(val1 + val2); break;
                    case '-': st.push(val1 - val2); break;
                    case '*': st.push(val1 * val2); break;
                    case '/': st.push(val1 / val2); break;
                }
            }
        }

        return st.top();
    }

    // Main
    int main() {
        string postfix;

        cout << "Masukkan ekspresi postfix: ";
        cin >> postfix;

        cout << "Hasil evaluasi: " << evaluatePostfix(postfix) << endl;

        return 0;
    }


    Multi Digit Postfix




    #include <iostream>
    #include <stack>
    #include <sstream>
    using namespace std;

    int evaluatePostfix(string exp) {
        stack<int> st;
        stringstream ss(exp);
        string token;

        while (ss >> token) {
            // Jika operator
            if (token == "+" || token == "-" || token == "*" || token == "/") {
                int val2 = st.top(); st.pop();
                int val1 = st.top(); st.pop();

                if (token == "+") st.push(val1 + val2);
                else if (token == "-") st.push(val1 - val2);
                else if (token == "*") st.push(val1 * val2);
                else if (token == "/") st.push(val1 / val2);
            }
            // Jika operand
            else {
                st.push(stoi(token));
            }
        }

        return st.top();
    }

    int main() {
        string postfix;

        cout << "Masukkan postfix (pisahkan dengan spasi): ";
        getline(cin, postfix);

        cout << "Hasil: " << evaluatePostfix(postfix) << endl;

        return 0;
    }


    Pengumpulan Tugas


    Absensi



    Tuesday, March 31, 2026

    STACK

     


    Definisi

    Stack adalah struktur data linear yang menyimpan kumpulan elemen, di mana proses:

    • penambahan (insertion / push)
    • penghapusan (deletion / pop)

    hanya dapat dilakukan pada satu sisi yang disebut top (puncak stack).


    Prinsip Stack

    Stack menggunakan prinsip:

    👉 LIFO (Last In, First Out)
    Artinya:

    • Elemen yang terakhir dimasukkan akan menjadi yang pertama dikeluarkan

    Analogi Sederhana

    Seperti tumpukan piring:

    • Piring terakhir yang diletakkan di atas → diambil pertama
    • Tidak bisa mengambil dari tengah

    Operasi Dasar Stack

    1. Push → menambahkan elemen ke stack
    2. Pop → menghapus elemen dari stack
    3. Peek/Top → melihat elemen paling atas
    4. isEmpty → mengecek apakah stack kosong
    5. isFull → mengecek apakah stack penuh (untuk array)
    Contoh Implementasi Stack dalam C++ (Menggunakan Array)

    #include <iostream>
    using namespace std;

    #define MAX 5

    class Stack {
    private:
        int arr[MAX];
        int top;

    public:
        Stack() {
            top = -1; // stack kosong
        }

        // Push
        void push(int x) {
            if (top == MAX - 1) {
                cout << "Stack Overflow\n";
            } else {
                arr[++top] = x;
                cout << x << " ditambahkan ke stack\n";
            }
        }

        // Pop
        void pop() {
            if (top == -1) {
                cout << "Stack Underflow\n";
            } else {
                cout << arr[top--] << " dihapus dari stack\n";
            }
        }

        // Peek
        void peek() {
            if (top == -1) {
                cout << "Stack kosong\n";
            } else {
                cout << "Elemen teratas: " << arr[top] << endl;
            }
        }
    };

    int main() {
        Stack s;

        s.push(10);
        s.push(20);
        s.push(30);

        s.peek();

        s.pop();
        s.peek();

        return 0;
    }


    Stack dengan Link List

    Pada implementasi ini:

    • Stack direpresentasikan sebagai Linked List
    • Setiap elemen disebut node
    • Setiap node memiliki:
      • data
      • pointer ke node berikutnya

    👉 Top stack = node paling depan (head)


    Operasi pada Stack (Linked List)

    • Push → menambah node di depan
    • Pop → menghapus node di depan
    • Peek → melihat data paling atas
    • isEmpty → cek apakah stack kosong

    Implementasi C++

    #include <iostream>
    using namespace std;

    // Struktur Node
    struct Node {
        int data;
        Node* next;
    };

    class Stack {
    private:
        Node* top;

    public:
        // Constructor
        Stack() {
            top = NULL;
        }

        // Push (tambah data)
        void push(int x) {
            Node* newNode = new Node();
            newNode->data = x;
            newNode->next = top;
            top = newNode;

            cout << x << " ditambahkan ke stack\n";
        }

        // Pop (hapus data)
        void pop() {
            if (top == NULL) {
                cout << "Stack Underflow\n";
                return;
            }

            Node* temp = top;
            cout << temp->data << " dihapus dari stack\n";
            top = top->next;
            delete temp;
        }

        // Peek (lihat data teratas)
        void peek() {
            if (top == NULL) {
                cout << "Stack kosong\n";
            } else {
                cout << "Elemen teratas: " << top->data << endl;
            }
        }

        // Cek kosong
        bool isEmpty() {
            return (top == NULL);
        }
    };

    int main() {
        Stack s;

        s.push(10);
        s.push(20);
        s.push(30);

        s.peek();

        s.pop();
        s.peek();

        return 0;
    }

    Penjelasan

    • Push
      • Buat node baru
      • Arahkan next ke top lama
      • Update top
    • Pop
      • Simpan node top
      • Geser top ke node berikutnya
      • Hapus node lama

    Kelebihan Stack dengan Linked List

    ✅ Tidak memiliki batas ukuran (dinamis)
    ✅ Tidak terjadi overflow seperti array (selama memori tersedia)


    Application of Stack: Expression Conversion

    Stack sangat banyak digunakan dalam manipulasi ekspresi matematika, khususnya untuk mengubah bentuk ekspresi agar mudah dievaluasi oleh komputer.


    Jenis Notasi Ekspresi

    Sebelum masuk ke konversi, pahami dulu 3 jenis notasi:

    1. Infix → operator di tengah
      Contoh: A + B
    2. Postfix (Reverse Polish Notation) → operator di belakang
      Contoh: A B +
    3. Prefix (Polish Notation) → operator di depan
      Contoh: + A B

    Mengapa Perlu Konversi?

    • Komputer lebih mudah memproses postfix/prefix
    • Tidak perlu tanda kurung
    • Tidak ambigu (tidak perlu aturan prioritas)

    Infix → Postfix

    Contoh

    Infix : A + B * C
    Postfix : A B C * +

    Algoritma (Menggunakan Stack)

    1. Scan dari kiri ke kanan
    2. Jika operand → langsung output
    3. Jika operator → bandingkan prioritas dengan stack
    4. Gunakan stack untuk menyimpan operator
    5. Keluarkan operator sesuai prioritas

    Intinya

    • Stack digunakan untuk menyimpan operator sementara

    Referensi


    Evaluasi Akhir Semester

      Studi Kasus Aplikasi Slide Power Point Latar Belakang Microsoft PowerPoint merupakan aplikasi presentasi yang memungkinkan pengguna membu...