Anda di halaman 1dari 12

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

BAB : ADT STACK


NAMA : ADHIPRAMANA RAIHAN YUTHADI
NIM : 175150200111023
TANGGAL : 23/10/2018
ASISTEN : RAHMATSYAH

A. DEFINISI MASALAH

1. Buat program untuk mengkonvesi dari infix ke notasi prefix menggunakan


program stack di atas!
2. Kembangkan program di atas untuk menghitung nilai dari ekspresi postfix dengan
inputan angka 1-9.

Contoh:
Gambar 7.1 Keluaran program
Hasil dari prefix *+12-34 adalah -3

3. Kembangkan program di atas dengan membuat stack yang berisi Object sehingga
isi Stack dapat diisi dengan object buku yang telah dibuat pada praktikum
sebelumnya. Terapkan kedua jenis stack, baik yang array maupun single linked
list!

Gambar 7.2 Contoh program ADT Stack Object


public class AppStackObject {
public static void main(String[] args) {
//implementasi Stack
Stack st = new Stack(3);
st.push(new Double(5));
st.push(new Double(8));
st.push(new Double(7));
while (!st.isEmpty()){
System.out.println(st.pop());
}
StackLinkedList stBuku = new StackLinkedList ();
stBuku.push(new Buku("Java"));
stBuku.push(new Buku("Algoritma dan STD"));
stBuku.push(new Buku("C++"));
System.out.println(stBuku.peek());
while (!stBuku.isEmpty()){
System.out.println(stBuku.pop());
}
}
}

Gambar 7.3. Keluaran program


7.0
8.0
5.0
C++
C++
Algoritma dan STD
Java

B. SOURCE CODE

Buku.java
1 public class Buku {

2 private String judul, kategori;


3 private double harga, denda;

4 public Buku(){
5 }

6 public Buku(String judul) {


7 this.judul = judul;
8 }

9 public String getJudul() {


10 return judul;
11 }

12 public String getKategori() {


13 return kategori;
14 }

15 public double getHarga() {


16 return harga;
17 }

18 public double getDenda() {


19 return denda;
20 }

21 }

Stack.java
1 public class Stack {

2 private int size;


3 private int top;
4 private Object[] data;

5 public Stack(int n) {
6 top = -1;
7 size = n;
8 data = new Object[size];
9 }

10 public boolean isPalindrome() {


11 return true;
12 }

13 public boolean isFull() {


14 return top == (size - 1) ? true : false;
15 }

16 public boolean isEmpty() {


17 return top == -1 ? true : false;
18 }

19 public void push(Object dt) {


20 if (!isFull()) {
21 data[++top] = dt;
22 }
23 }

24 public Object pop() {


25 Object hasil = null;
26 if (!isEmpty()) {
27 hasil = data[top--];
28 }
29 if (hasil.getClass() == Buku.class) {
30 return((Buku)hasil).getJudul();
31 }
32 else{
33 return hasil;
34 }
35 }

36 }

StackLinkedList.java
1 import java.util.EmptyStackException;

2 class Node {

3 Object data = new Buku();


4 Node next;

5 Node(Object data) {
6 this.data = data;
7 }

8 Node(Buku data) {
9 this.data = data;
10 }

11 }

12 public class StackLinkedList {

13 private Node head, tail, top;

14 public StackLinkedList() {
15 head = tail = top = null;
16 }

17 public boolean isEmpty() {


18 return top == null;
19 }
20 public Object pop() {
21 if (isEmpty()) {
22 throw new EmptyStackException();
23 }
24 Object dataPop = top.data;
25 removeLast();
26 top = tail;
27 if (dataPop.getClass() == Buku.class) {
28 return ((Buku) dataPop).getJudul();
29 } else {
30 return dataPop;
31 }
32 }

33 private void removeLast() {


34 Node temp = head;
35 if (!isEmpty()) {
36 if (tail == head) {
37 head = tail = null;
38 } else {
39 while (temp.next != tail) {
40 temp = temp.next;
41 }
42 temp.next = null;
43 tail = temp;
44 temp = null;
45 }
46 }
47 }

48 public void push(Object dt) {


49 addLast(dt);
50 top = tail;
51 }

52 private void addLast(Object dt) {


53 Node newNode = new Node(dt);
54 if (isEmpty()) {
55 head = tail = newNode;
56 } else {
57 tail.next = newNode;
58 tail = newNode;
59 }
60 }

61 public Object peek() {


62 if (top.data.getClass() == Buku.class) {
63 return ((Buku) top.data).getJudul();
64 } else {
65 return top.data;
66 }
67 }

68 }

Main.java
1 import java.util.Scanner;
2 public class Main {

3 private static int getPrioritas(Object a) {


4 if (a.equals('+') || a.equals('-')) {
5 return 1;
6 } else if (a.equals('*') || a.equals('/')) {
7 return 2;
8 } else if (a.equals('^')) {
9 return 3;
10 } else {
11 return 0;
12 }
13 }

14 private static boolean isOperator(char c) {


15 return c == '+' || c == '-' || c == '*' || c == '/'
16 || c == '^' || c == '(' || c == ')';
17 }

18 public static String prefix(String a) {


19 StackLinkedList stack = new StackLinkedList();
20 a = "(" + a;
21 stack.push(')');
22 String res = "";
23 for (int i = a.length() - 1; i >= 0; i--) {
24 char ch = a.charAt(i);
25 if (!isOperator(ch)) {
26 res += ch;
27 } else if (ch == ')') {
28 stack.push(ch);
29 } else if (ch == '(') {
30 while ((char) stack.peek() != ')') {
31 res += stack.pop();
32 }
33 stack.pop();
34 } else if (getPrioritas(ch) <
getPrioritas((char) stack.peek())) {
35 res += stack.pop();
36 stack.push(ch);
37 } else {
38 stack.push(ch);
39 }
40 }
41 String ret = "";
42 for (int i = 0; i < res.length(); i++) {
43 ret = res.charAt(i) + ret;
44 }
45 return ret;
46 }

47 public static String postfix(String a) {


48 StackLinkedList stack = new StackLinkedList();
49 a = a + ")";
50 stack.push('(');
51 String res = "";
52 for (int i = 0; i < a.length(); i++) {
53 char ch = a.charAt(i);
54 if (!isOperator(ch)) {
55 res += ch;
56 } else if (ch == '(') {
57 stack.push(ch);
58 } else if (ch == ')') {
59 while ((char) stack.peek() != '(') {
60 res += stack.pop();
61 }
62 stack.pop();
63 } else if (getPrioritas(ch) <
getPrioritas((char) stack.peek())) {
64 res += stack.pop();
65 stack.push(ch);
66 } else {
67 stack.push(ch);
68 }
69 }
70 return res;
71 }

72 public static double hitungPostfix(String a) {


73 StackLinkedList stack = new StackLinkedList();
74 double hasil = 0;
75 for (int i = 0; i < a.length(); i++) {
76 char ch = a.charAt(i);
77 if (!isOperator(ch)) {
78 stack.push(Double.valueOf(ch + ""));
79 } else {
80 double op2 = (double) stack.pop();
81 double op = (double) stack.pop();
82 switch (ch) {
83 case '+':
84 hasil = op + op2;
85 break;
86 case '-':
87 hasil = op - op2;
88 break;
89 case '*':
90 hasil = op * op2;
91 break;
92 case '/':
93 hasil = op / op2;
94 break;
95 case '^':
96 hasil = Math.pow(op, op2);
97 break;
98 default:
99 hasil = 0;
100 break;
101 }
102 stack.push(hasil);
103 }
104 }
105 return hasil;
106 }
107 public static void main(String[] args) {
108 Scanner in = new Scanner(System.in);
109 System.out.println("Soal No.1");
110 System.out.print("Masukkan operasi : ");
111 String test = in.next();
112 System.out.println("Notasi infix : " + test);
113 System.out.println("Notasi Prefix : " +
prefix(test));
114 System.out.println("Notasi Postfix : " +
postfix(test));
115 System.out.println("\nSoal No. 2");
116 System.out.println("Hasil dari postfix " +
postfix(test) + " adalah " + hitungPostfix(postfix(test)) +
"\n");
117 System.out.println("Soal No. 3");
118 Stack stAr = new Stack(3);
119 System.out.println("-Stack Array(Double)");
120 stAr.push(new Double(5));
121 stAr.push(new Double(8));
122 stAr.push(new Double(7));
123 while (!stAr.isEmpty()) {
124 System.out.println(stAr.pop());
125 }

126 System.out.println("-Stack Array(Buku)");


127 Stack stArBuku = new Stack(3);
128 stArBuku.push(new Buku("PHP"));
129 stArBuku.push(new Buku("Basis Data"));
130 stArBuku.push(new Buku("Sistem Operasi"));
131 while (!stArBuku.isEmpty()) {
132 System.out.println(stArBuku.pop());
133 }

134 System.out.println("-Stack Linked List(Double)");


135 StackLinkedList stLL = new StackLinkedList();
136 stLL.push(new Double(50));
137 stLL.push(new Double(25));
138 stLL.push(new Double(0));
139 while (!stLL.isEmpty()) {
140 System.out.println(stLL.pop());
141 }

142 System.out.println("-Stack Linked List(Buku)");


143 StackLinkedList stLLBuku = new StackLinkedList();
144 stLLBuku.push(new Buku("Java"));
145 stLLBuku.push(new Buku("Algoritma dan STD"));
146 stLLBuku.push(new Buku("C++"));
147 System.out.println(stLLBuku.peek());
148 while (!stLLBuku.isEmpty()) {
149 System.out.println(stLLBuku.pop());
150 }
151 }
152 }
C. PEMBAHASAN

Buku.java
1 Deklarasi class dengan nama Buku
2 Deklarasi variabel privat bernama judul dan kategori dengan tipe data String
3 Deklarasi variabel privat bernama harga dan denda dengan tipe data double
4 Deklarasi constructor Buku tanpa menggunakan parameter
5 Proses menutup constructor
6 Deklarasi constructor Buku dengan parameter variabel judul dengan tipe data
String
7 Inisialisasi variabel judul dengan dirinya sendiri menggunakan keyword this
8 Proses menutup constructor
9 Proses deklarasi method getJudul
10 Proses mengembalikan nilai variabel judul
11 Proses menutup method getJudul
12 Proses deklarasi method getKategori
13 Proses mengembalikan nilai variabel kategori
14 Proses menutup method getKategori
15 Proses deklarasi method getHarga
16 Proses mengembalikan nilai variabel harga
17 Proses menutup method getHarga
18 Proses deklarasi method getDenda
19 Proses mengembalikan nilai variabel denda
20 Proses menutup method getDenda
21 Proses menutup class

Stack.java
1 Deklarasi class dengan nama Stack
2–4 Deklarasi variabel private size dan top dengan tipe data integer serta Array
of Object dengan nama data
5–9 Deklarasi constructor dengan parameter n yang bertipe data integer,
didalamnya terdapat inisialisasi variabel top dengan nilai -1, variabel size
sama dengan n, dan array data dengan panjang sama dengan size
10 – 12 Deklarasi method boolean dengan nama isPalindrome yang akan
mengembalikan nilai true
13 – 15 Deklarasi method isFull yang digunakan untuk mengecek penuh tidaknya
stack dengan syarat yaitu apabila variabel top bernilai sama dengan
variabel size dikurangi satu maka akan mengembalikan nilai true dan jika
tidak memenuhi syarat tersebut maka bernilai false
16 – 18 Deklarasi method isEmpty yang digunakan untuk mengecek kosong
tidaknya stack dengan syarat yaitu apabila variabel top bernilai sama
dengan -1 maka akan mengembalikan nilai true dan jika tidak memenuhi
syarat tersebut maka bernilai false
19 – 23 Deklarasi method void dengan nama push yang berparameter Object dt
didalamnya terdapat seleksi if dengan syarat jika tidak memenuhi method
isFull maka akan terjadi inisialisasi array data indeks ke ++top sama
dengan dt. Method ini digunakan untuk melakukan penambahan data pada
Stack.
24 – 35 Deklarasi method void dengan nama pop yang didalamnya terdapat dua
seleksi if untuk menginisialisasi variabel hasil sama dengan array data
indeks ke top-- dan untuk mengembalikan hasil pemanggilan method
getJudul oleh object hasil serta seleksi else untuk mengembalikan variabel
hasil
36 Proses menutup class Stack

StackLinkedList.java
1 Proses impor EmptyStackException dari library java
2 - 11 Proses deklarasi class Node yang didalamnya terdapat intansiasi objek
data dari class buku, deklarasi variabel next serta terdapat dua constructor
yang masing masing digunakan untuk menginisialisasi variabel data
bertipe data object dan variabel data bertipe data Buku
12 Deklarasi class dengan nama StackLinkedList
13 Inisialisasi variabel head, tail, top yang bertipe data Node
14 - 16 Deklarasi constructor yang didalamnya terdapat inisialisasi variabel head,
tail, dan top sama dengan null
17 – 19 Deklarasi method boolean dengan nama isEmpty yang digunakan untuk
mengembalikan nilai true/false dengan kondisi top sama dengan null
20 – 32 Deklarasi method pop yang didalamnya terdapat seleksi if untuk
melakukan throw EmptyStackException, inisialisasi object dataPop,
pemanggilan method remove last, seleksi if untuk mengembalikan nilai
dari pemanggilan method getJudul oleh variabel dataPop dan seleksi else
untuk mengembalikan nilai dari variable dataPop
33 – 47 Deklarasi method removeLast yang didalamnya terdapat inisialisasi
variabel temp, seleksi if dengan syarat tidak memenuhi method isEmpty
dan didalamnya lagi terdapat seleksi if dengan syarat jika tail sama dengan
head maka nilai head dan tail adalah null, dan seleksi else yang
didalamnya terdapat perulangan while dan inisialisasi variabel temp.next,
tail, dan temp
48 - 51 Deklarasi method push dengan parameter variabel dt yang didalamnya
terdapat pemanggilan method addLast dengan parameter variabel dt dan
inisialisasi variabel top sama dengan tail
52 – 60 Deklarasi method addLast dengan parameter variabel dt yang didalamnya
terdapat instansiasi newNode, seleksi if dengan syarat jika memenuhi
kondisi dalam method isEmpty maka nilai variabel head dan tail sama
dengan variabel newNode, dan seleksi else yang berisi inisialisasi variabel
tail.next dan tail
61 - 67 Deklarasi method peek yang didalamnya terdapat seleksi if untuk
mengembalikan nilai dari hasil pemanggilan method getJudul oleh
variabel top.data dan seleksi else untuk mengembalikan nilai dari variabel
top.data
68 Proses menutup class StackLinkedList

Main.java
1 Proses impor Scanner untuk inputan
2 Deklarasi class dengan nama Main
3 - 13 Deklarasi method static Integer dengan nama getPrioritas yang
berparameter variabel a, didalamnya terdapat seleksi if else untuk
menentukan prioritas operan seperti operan ‘+’ dan ‘-‘ akan
mengembalikan nilai 1, operan ‘*’ dan ‘/’ akan mengembalikan nilai 2,
operan ‘^’ akan mengembalikan nilai 3 dan operator lainya akan
mengembalikan nilai 0
14 - 17 Deklarasi method static boolean dengan nama isOperator dan memiliki
parameter variabel c yang akan mengembalikan nilai true/false
berdasarkan kondisi variabel c merupakan operator(‘+’, ‘-‘, ‘*’, ‘/’, ‘^’,
‘)’, ‘(‘ ) atau tidak
18 - 46 Deklarasi method String dengan nama prefix berparameter variabel a yang
digunakan untuk merubah notasi infix menjadi notasi prefix dengan cara
membalikkan urutan dari notasi infix dan akan mencetak operator terlebih
dahulu sesuai dengan hirarkinya diikuti dengan operandnya
47 - 71 Deklarasi method String dengan nama postfix berparameter variabel a
yang digunakan untuk merubah notasi infix menjadi postfix dengan cara
mencetak operan terlebih dahulu baru diikuti dengan operatornya
72 - 106 Dekalrasi method hitungPostfix yang digunakan untuk menghitung hasil
operasi postfix dengan cara merubahnya dari tipe data String menjadi tipe
data double dan selanjutnya akan melakukan operasi matematika sesuai
dengan operatornya pada seleksi switch, method ini akan mengembalikan
variabel hasil sebagai hasil akhir perhitungan operasi tersebut yang bertipe
data double
107 Deklarasi method main
108 Instansiasi Scanner dengan nama in
109 – 114 Proses pengerjaan tugas nomor 1 dengan cara memasukkan inputan
operasi, setelah itu akan menampilkan notasi infix, prefix serta notasi
postfix dari operasi yang telah diinputkan
115 - 116 Proses pengerjaan tugas nomor 2 dengan menampilkan hasil perhitungan
notasi postfix dari operasi hasil inputan menggunakan method
hitungPostfix
117 – 125 Proses pengerjaan tugas nomor 3 dengan cara menginstansiasi Stack yang
menggunakan array dengan nama stAr yang merupakan stack bertipe data
double, setelah itu dilakukan proses pemanggilan method push untuk
memasukkan data pada stack tersebut dengan nilai 5,8, 7 dan selanjutnya
dilakukan deklarasi perulangan while dengan syarat stack stAr tidak
kosong maka akan dilakukan pencetakan isi stack stAr tersebut dengan
menggunakan method pop
126 – 133 Proses pengerjaan tugas nomor 3 dengan cara menginstansiasi Stack yang
menggunakan array dengan nama stArBuku yang merupakan stack bertipe
data Buku, setelah itu dilakukan proses pemanggilan method push untuk
memasukkan data pada stack tersebut dengan nilai “PHP”, “Basis Data”,
“Sistem Operasi” dan selanjutnya dilakukan deklarasi perulangan while
dengan syarat stack stArBuku tidak kosong maka akan dilakukan
pencetakan isi stack stArBuku tersebut dengan menggunakan method pop
134 – 141 Proses pengerjaan tugas nomor 3 dengan cara menginstansiasi Stack yang
menggunakan linked list dengan nama stLL yang merupakan stack bertipe
data double, setelah itu dilakukan proses pemanggilan method push untuk
memasukkan data pada stack tersebut dengan nilai 50, 25, 0 dan
selanjutnya dilakukan deklarasi perulangan while dengan syarat stack
stLL tidak kosong maka akan dilakukan pencetakan isi stack stLL tersebut
dengan menggunakan method pop
142 - 150 Proses pengerjaan tugas nomor 3 dengan cara menginstansiasi Stack yang
menggunakan linked list dengan nama stLLBuku yang merupakan stack
bertipe data Buku, setelah itu dilakukan proses pemanggilan method push
untuk memasukkan data pada stack tersebut dengan nilai “Java”,
“Algoritma dan STD”, “C++”, setelah itu dilakukakn pemanggilan
method peek oleh stack stLLBuku dan selanjutnya dilakukan deklarasi
perulangan while dengan syarat stack stLLBuku tidak kosong maka akan
dilakukan pencetakan isi stack stLLBuku tersebut dengan menggunakan
method pop
151 Proses menutup method main
152 Proses menutup class Main

D. SCREENSHOT PROGRAM

E. KESIMPULAN

1. Stack atau dalam bahasa indonesia dikenal sebagai tumpukan adalah salah satu
konsep struktur data yang menggunakan prinsip LIFO ( Last In First Out ) yang
berarti data yang paling terakhir masuk akan menjadi data yang keluar terlebih
dahulu.

2. Berdasarkan penyusunnya stack dibagi menjadi dua jenis yaitu stack yang tersusun
dari array dan stack yang tersusun dari linked list ( Bisa berupa single maupun
double linked list ). Perbedaan dari kedua jenis stack tersebut adalah pada stack
yang menggunakan linked list terdapat berbagai method khusus seperti method
addLast dan addFirst yang sama fungsinya seperti method push serta method
removeLast dan removeFirst yang sama fungsinya dengan method pop. Sedangkan
pada stack yang menggunakan array tidak terdapat method – method khusus seperti
yang dimiliki pada linked list, stack yang menggunakan array hanya bergantung
pada indeks saja dan memiliki method push yang memiliki fungsi untuk menambah
data pada array tersebut agar terlihat lebih dinamis.
3. Terdapat 5 (lima) method utama yang ada pada Stack yaitu, method Push, Pop,
Peek. isEmpty, dan isFull. Berikut penjelasanya :
 Push() : Digunakan untuk menambahkan suatu data pada Stack
 Pop() : Digunakan untuk mengambil data pada top dari sebuah Stack
 Peek() : Digunakan untuk melihat data pada top dari sebuah Stack
 isEmpty() : Digunakan untuk mengecek kosong tidaknya suatu Stack
 isFull() : Digunakan untuk mengecek penuh tidaknya suatu Stack

4. Stack dapat digunakan untuk memecahkan berbagai macam masalah yang ada di
kehidupan sehari – hari, seperti pada tugas di atas stack dapat digunakan untuk
mengubah suatu notasi infix menjadi prefix dan postfix dengan cara menyimpan
operator kedalam stack tersebut dan mencetak operand nya, setelah itu operator
tersebut akan dicetak berdasarkan hirarkinya atau jika ada tanda tutup kurung “)”.
Selain itu stack juga dapat digunakan untuk merubah bilangan desimal menjadi
biner dengan cara melakukan operasi modulo dari suatu nilai dengan angka 2 dan
sisa yang dihasilkan akan di masukkan ke stack dan hal itu diulang terus hingga
nilai dari bilangan tersebut mencapai 0.

Anda mungkin juga menyukai