# Praktikum 2

## Pengantar

Pada percobaan ini, kita akan membuat program untuk melakukan konversi notasi **infix** menjadi notasi **postfix**.

Perhatikan class diagram `Postfix` berikut sebagai acuan.

<figure><img src="https://3303136777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYswnbGm4Ak9kOqe8uURG%2Fuploads%2F6nQzDWFjkCZUYs4OZ5HY%2Fimage.png?alt=media&#x26;token=5cc5e40c-b1a3-4b92-bb65-8835d9a9438d" alt=""><figcaption><p>Class Diagram Postfix</p></figcaption></figure>

## Langkah Percobaan

* Buatlah proyek dengan nama `Praktikum2`. Kemudian buatkla class `Postfix` sesuai dengan class diagram yang telah dijelaskan sebelumnya.
* Tambahkan atribut `n`, `top`, dan `stack` sesuai diagram class `Postfix` tersebut.
* Tambahkan konstruktor `Postfix` seperti potongan kode berikut,

```java
public Postfix(int total) {
    n = total;
    top = -1;
    stack = new char[n];
    push('(');
}
```

* Buat method `push()`.

```java
public void push(char c) {
    top++;
    stack[top] = c;
}
```

* Buat method `pop()`.

```java
public char pop() {
    char item = stack[top];
    top--;
    return item;
}
```

* Buat method `isOperand()` dengan tipe boolean yang digunakan untuk mengecek apakah elemen data berupa operand.

{% code overflow="wrap" %}

```java
public boolean isOperand(char c) {
    if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || (c == ' ' && c == '.')) {
        return true;
    } else {
        return false;
    }
}
```

{% endcode %}

* Buat method `isOperator()` dengan tipe boolean yang digunakan untuk mengecek apakah elemen data berupa operator.

{% code overflow="wrap" %}

```java
public boolearn isOperator(char c) {
    if(c == '^' || c == '%' || c == '/' || c == '*' || c == '-' || c == '+') {
        return true;
    } else {
        return false;
    }
}
```

{% endcode %}

* Buat method `derajat()` yang mempunyai nilai kembalian integer untuk menentukan derajat operator.

{% code overflow="wrap" %}

```java
public int derajat(char c) {
    switch(c) {
        case '^':
            return 3;
        case '%':
            return 2;
        case '/':
            return 2;
        case '*':
            return 2;
        case '-':
            return 1;
        case '+':
            return 1;
        default:
            return 0;
    }
}
```

{% endcode %}

* Buat method konversi untuk melakukan konversi notasi infix menjadi notasi postfix dengan cara mengecek satu persatu elemen data pada **String Q** sebagai parameter masukan.

{% code overflow="wrap" %}

```java
public String konversi(String Q) {
    String P = "";
    char c;
    
    for(int i=0; i < n; i++) {
        c = Q.charAt(i);
        if(isOperand(c)) {
            P = P + c;
        }
        if(c == '(') {
            push(c);
        }
        if(c == ')') {
            while(stack[top] != '(') {
                P = P + pop();
            }
            pop();
        }
        if(isOperator(c)) {
            while(derajar(stack[top]) >= derajat(c)) {
                P = P + pop();
            }
            push(c);
        }
    }
    return P;
}
```

{% endcode %}

* Selanjutnya, buat class baru dengan nama `PostfixMain` tetap pada proyek Praktikum2. Buat class main, kemudian buat variabel `P` dan `Q`. Variabel `P` digunakan untuk menyimpan hasil akhir notasi postfix setelah dikonversi, sedangkan variabel `Q` digunakan untuk menyimpan masukan dari pengguna berupa ekspresi matematika dengan notasi infix. Deklarasikan variabel `Scanner` dengan nama `sc`, kemudian panggil fungsi *built-in* **trim** yang digunakan untuk menghapus adanya spasi di depan atau di belakang teks dari teks persamaan yang dimasukkan oleh pengguna.

{% code overflow="wrap" %}

```java
Scanner sc = new Scanner(System.in);
String P, Q;
System.out.println("Masukkan ekspresi matematika (infix): ");
Q = sc.nextLine();
Q.trim();
Q = Q + ")";
```

{% endcode %}

Penambahan string **“)”** digunakan untuk memastikan semua simbol/karakter yang masih berada di stack setelah semua persamaan terbaca, akan dikeluarkan dan dipindahkan ke postfix.

* Buat variabel total untuk menghitung banyaknya karaketer pada variabel Q.

```java
int total = Q.length();
```

* Lakukan instansiasi objek dengan nama post dan nilai parameternya adalah total. Kemudian panggil method konversi untuk melakukan konversi notasi infix Q menjadi notasi postfix P.

```java
Postfix post = new Postfix(total);
P = post.konversi(Q);
System.out.println("Postfix: " + P);
```

* Compile dan jalankan class `PostfixMain` dan amati hasilnya.

<figure><img src="https://3303136777-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FYswnbGm4Ak9kOqe8uURG%2Fuploads%2FqG9iMYErPoSXRnI2FNew%2Fimage.png?alt=media&#x26;token=b9000c04-dbf9-4228-bc20-633cc11ff73e" alt=""><figcaption></figcaption></figure>

## Pertanyaan

1. Perhatikan class Postfix, jelaskan alur kerja method derajat!&#x20;
2. Apa fungsi kode program berikut? `c = Q.charAt(i);`
3. Jalankan kembali program tersebut, masukkan ekspresi **3\*5^(8-6)%3**. Tampilkan hasilnya!&#x20;
4. Pada soal nomor 3, mengapa tanda kurung tidak ditampilkan pada hasil konversi? Jelaskan!
