TUGAS PERTEMUAN 6_STRUKTUR DATA (D)

Nama : Rado Putra Yustisiawan

NRP : 5025251048

Kelas : Struktur Data D



TUGAS 1
Mencoba setiap short code yang tersedia, dengan format pengerjaan
a. Nama program dan deskripsi
b. Screenshoot dari program
c. Penjelasan dari program
d. Analisa Operasi Stack
e. Analisa Elemen Konversi
f. Link source code


1) KODE 1

    a. Nama Program dan Deskripsi
        Nama Program : Program Konverter Ekspresi Infix ke Postfix (Standard)
        Deskripsi : Program ini berfungsi untuk mengubah ekspresi matematika dari bentuk Infix menjadi Postfix secara otomatis. Program ini mendukung berbagai operator aritmatika dasar, perpangkatan, serta penggunaan tanda kurung untuk menentukan prioritas perhitungan secara dinamis.

    b. Screenshoot :

    c. Penjelasan Program

#include <iostream>: Baris ini merupakan instruksi preprocessor yang berfungsi untuk menyertakan pustaka standar iostream. Pustaka ini menyediakan fasilitas dasar untuk operasi input dan output (seperti cin dan cout) dalam C++.

#include <stack>: Instruksi untuk menyertakan pustaka Standard Template Library (STL) stack. Ini memungkinkan kita menggunakan struktur data tumpukan siap pakai beserta fungsi pendukungnya seperti push(), pop(), dan top().

#include <string>: Pustaka ini digunakan agar program dapat mendefinisikan dan memanipulasi tipe data teks (string) secara dinamis dan efisien.

#include <cctype>: Menyediakan fungsi-fungsi pengujian karakter, dalam hal ini fungsi isalnum() yang digunakan untuk mengecek apakah suatu karakter adalah huruf atau angka.

using namespace std;: Pernyataan ini memberitahu compiler untuk menggunakan ruang nama (namespace) standar, sehingga kita tidak perlu menuliskan awalan std:: di depan setiap perintah standar.

int precedence(char op) { ... }: Sebuah fungsi yang mengembalikan nilai integer untuk menentukan derajat kekuatan operator. Pangkat (^) diberi nilai 3 (tertinggi), kali dan bagi (*, /) nilai 2, serta tambah dan kurang (+, -) nilai 1.

bool isOperator(char c) { ... }: Fungsi boolean yang bertugas memvalidasi apakah karakter yang sedang diproses merupakan salah satu dari lima operator aritmatika dasar yang didukung.

string infixToPostfix(string infix) { ... }: Fungsi inti proses konversi. Menggunakan parameter string infix dan akan mengembalikan hasil berupa string postfix.

stack<char> st;: Deklarasi objek stack bernama st yang berfungsi menyimpan operator dan tanda kurung secara sementara selama proses pemindaian.

for (int i = 0; i < infix.length(); i++): Perulangan yang memproses setiap karakter dalam string input satu demi satu, dari indeks awal hingga akhir.

if (isalnum(c)): Jika karakter c adalah operand (angka/huruf), maka karakter tersebut langsung digabungkan ke variabel string postfix.

else if (c == '('): Jika ditemukan kurung buka, ia akan langsung dimasukkan ke dalam stack tanpa syarat, sebagai pembatas awal sub-ekspresi.

else if (c == ')'): Jika ditemukan kurung tutup, program akan melakukan perulangan untuk mengeluarkan semua operator dari stack ke postfix sampai menemukan kurung buka pendampingnya.

st.pop(); // hapus '(': Setelah semua operator di dalam kurung dipindahkan, tanda kurung buka di dalam stack dibuang karena tidak diperlukan dalam notasi postfix.

while (!st.empty() && precedence(st.top()) >= precedence(c)): Logika krusial yang memastikan urutan prioritas. Jika operator di puncak stack lebih kuat atau sama kuat dengan operator baru, maka operator di stack harus keluar (pop) terlebih dahulu.

st.push(c);: Setelah jalan dibersihkan dari operator yang lebih kuat, operator baru dimasukkan ke dalam stack.

while (!st.empty()) { ... }: Setelah seluruh string infix selesai dipindai, semua sisa operator yang masih tertinggal di dalam stack dipindahkan ke hasil akhir postfix.

cin >> infix;: Mengambil input ekspresi matematika dari pengguna melalui terminal.

string postfix = infixToPostfix(infix);: Memanggil fungsi konversi dan menyimpan hasilnya ke dalam variabel baru untuk ditampilkan.

return 0;: Instruksi untuk mengakhiri fungsi main dan mengirimkan sinyal ke sistem operasi bahwa program telah berjalan dengan sukses.

    d. Analisa Operasi Stack
        (data input dari A+B *(C-D))
        
    
    e. Analisa Elemen Konversi

Operand Processing: Karakter alfabet (A, B, C, D) bersifat pasif dan hanya melewati proses tanpa masuk ke stack memory.

Precedence Handling: Perhatikan saat operator * bertemu +. Karena * lebih tinggi, ia tidak mengeluarkan +, melainkan menumpuk di atasnya.

Sub-Expression Isolation: Karakter ( dan ) menciptakan area isolasi. Apapun yang terjadi di dalam kurung akan diselesaikan (di-pop) secara total sebelum program lanjut memproses bagian di luar kurung.

Final Cleanup: Langkah terakhir setelah perulangan selesai adalah memastikan stack benar-benar kosong untuk menjamin semua operator telah berpindah ke notasi postfix.

    f. Link Source Code
https://drive.google.com/file/d/1FKWuHU58BFPgAI9kicG3YzESQ_g4D-Ep/view?usp=sharing




2) KODE 2

    a. Nama Program dan Deskripsi
        Nama Program : Program Kalkulator Postfix
        Deskripsi : Program ini berfungsi untuk menghitung nilai numerik dari sebuah ekspresi postfix yang terdiri dari angka satuan (0-9). Program ini menjamin ketepatan urutan operasi aritmatika (penjumlahan, pengurangan, perkalian, pembagian) tanpa memerlukan tanda kurung.

    b. Screenshoot


    c. Penjelasan Program

#include <cctype>: Pustaka ini sangat penting karena menyediakan fungsi isdigit(), yang bertugas memvalidasi apakah karakter yang sedang dibaca merupakan angka atau bukan.

int evaluatePostfix(string exp): Fungsi ini menerima string postfix dan mengembalikan hasil perhitungan dalam bentuk integer.

stack<int> st: Mendeklarasikan stack tipe int. Di sini stack berfungsi sebagai penyimpan nilai numerik sementara, bukan karakter operator.

for (char c : exp): Menggunakan perulangan for-each untuk memindai setiap karakter dalam string ekspresi secara berurutan dari kiri ke kanan.

st.push(c - '0'): Karena c bertipe karakter (char), kita menguranginya dengan karakter '0' (berdasarkan nilai ASCII) untuk mendapatkan nilai integer yang sesungguhnya sebelum dimasukkan ke stack.

int val2 = st.top(); st.pop();: Mengambil nilai teratas sebagai operan kedua. Dalam operasi seperti pengurangan atau pembagian, nilai yang terakhir masuk harus menjadi pengurang/pembagi.

int val1 = st.top(); st.pop();: Mengambil nilai di bawahnya sebagai operan pertama.

switch (c) { ... }: Memilih operasi matematika berdasarkan karakter operator yang ditemukan (+, -, *, /).

st.push(val1 [operator] val2): Hasil perhitungan dari dua angka tersebut segera dimasukkan kembali ke puncak stack agar bisa digunakan pada operasi berikutnya.

return st.top(): Setelah seluruh string diproses, hanya akan ada satu elemen tersisa di stack, yaitu hasil akhir dari seluruh ekspresi.

cin >> postfix: Mengambil input ekspresi postfix (misal: "231*+").

    d. Analisa Operasi Stack
        Simulasi perhitungan untuk ekspresi postfix: 542 * + (Setara 5+(4*2)



    e. Analisa Elemen Konversi
        
Operan (Digits): Setiap angka satuan diidentifikasi dan dikonversi dari tipe data char ke int untuk diproses secara matematis.

Operator Processing: Karakter operator bertindak sebagai pemicu (trigger) untuk melakukan operasi terhadap dua data teratas di memori stack.

Data Retrieval (Pop Order): Elemen diambil secara LIFO (Last In First Out). Penting untuk membedakan val1 dan val2 agar operasi non-komutatif seperti pengurangan dan pembagian tidak tertukar posisinya.

Memory Efficiency: Stack hanya menyimpan nilai yang diperlukan untuk langkah perhitungan berikutnya, sehingga penggunaan memori sangat efisien.

    f. Link Source Code
https://drive.google.com/file/d/1nZOppk7-jBOGvFP3JzwE5EK_R_tL7AIH/view?usp=sharing




3) KODE 3

    a. Nama Program dan Deskripsi
        Nama Program : Program Kalkulator Postfix Lanjut (Multi-Digit Evaluator)
        Deskripsi : Program ini dirancang untuk menghitung hasil akhir dari ekspresi postfix yang dipisahkan oleh spasi. Program mampu membedakan antara bilangan multi-digit dan operator menggunakan metode tokenizing, sehingga proses perhitungan menjadi lebih fleksibel dan akurat untuk angka besar.

    b. Screenshoot

    c. Penjelasan Program

#include <sstream>: Pustaka yang memungkinkan string diperlakukan sebagai aliran data (stream), memudahkan pengambilan data kata per kata.

stringstream ss(exp): Mengubah string input menjadi objek aliran agar bisa diproses oleh operator >>.

while (ss >> token): Perulangan yang berfungsi mengambil satu unit data (angka atau operator) yang dipisahkan oleh spasi ke dalam variabel token.

if (token == "+" || ...): Pemeriksaan langsung terhadap isi string token. Jika string tersebut adalah simbol matematika, maka program bersiap melakukan operasi aritmatika.

int val2 = st.top(); st.pop();: Mengambil elemen teratas stack sebagai operan kedua (angka yang datang terakhir).

int val1 = st.top(); st.pop();: Mengambil elemen di bawahnya sebagai operan pertama.

st.push(val1 [op] val2): Menggunakan struktur logika if-else untuk mengeksekusi perhitungan sesuai simbol yang ditemukan dan hasilnya disimpan kembali ke stack.

st.push(stoi(token)): Jika token bukan operator, maka dianggap sebagai angka. Fungsi stoi (string to integer) mengubah teks multi-digit tersebut menjadi angka asli sebelum di-push.

getline(cin, postfix): Mengambil seluruh baris input dari pengguna, termasuk spasi, agar tidak terputus di tengah jalan.

return st.top(): Mengembalikan nilai tunggal yang tersisa di dalam stack sebagai jawaban final.

    d. Analisa Operasi Stack
        Simulasi perhitungan untuk input: *"12 8 + 2 " (Setara dengan (12 + 8) * 2)


    e. Analisa Elemen Konversi

Tokenizing System: Sistem ini jauh lebih kuat karena tidak membatasi jumlah digit. Spasi bertindak sebagai batas fisik antar data.

String Comparison: Pengecekan operator menggunakan perbandingan string (token == "+") membuat kode lebih mudah dibaca daripada pengecekan karakter tunggal.

Integer Transformation: Penggunaan stoi() secara otomatis menangani konversi tipe data dari input teks menjadi data numerik yang siap dihitung.

LIFO logic: Operasi tetap mengikuti prinsip terakhir masuk pertama keluar, yang sangat krusial untuk menjaga urutan kalkulasi matematika pada notasi postfix.

    f. Link Source Code
https://drive.google.com/file/d/1l1KIcUGPKHJIG_jfgECXRU9hRYFyvMDD/view?usp=sharing








-----------------------------------------------------------------------------------------------------------------------

Itu dia implementasi kodingan saya untuk tugas kali ini. Saya sadar ini masih jauh dari sempurna, jadi mohon koreksinya jika ada kesalahan. 

Let’s discuss in the comments if you have any thoughts. 

                                                                                                                                     Thankyou, ciao!





    



































































Komentar

Postingan populer dari blog ini

TUGAS PERTEMUAN 2_STRUKTUR DATA (D)

TUGAS PERTEMUAN 3_STRUKTUR DATA (D)