1. Tujuan
• Memahami Abstrak Data Type (ADT) Statis yaitu Stack, Queue, Collections, ArrayList dan Set
2. Dasar Teori
• Stack (Tumpukan) dapat dibayangkan sebagai suatu keranjang dimana hanya dat terakhir yang dapat diperoleh kembali dengan satu langkah. Data di bawah hanya dapat diambil jika data di sebelah atasnya telah diambil (dikeluarkan) terlebih dahulu, sehingga struktur data ini dapat dikatakan LIFO (Last In First out).
• Queue (antrian) apada kenyataannya misal dijumpai pada antrian karcis untuk membeli tiket, berlaku konsep FIFO (First In First Out).
3. Tugas Pendahuluan
1. Jelaskan apa yang dimaksud dengan a. Stack b. Queue c. Collection d. ArrayList e. Set 4. Praktikum
Percobaan 1. Program Tumpukan (Stack) package myStack;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Stack;
private static Stack<Integer> stack; private static int ukuran;
public static void main(String[] args) {
System.out.print("Berapa ukuran STACK diinginkan? "); ukuran = inputData();
buatStack(); bacaData(); tulisData(); }
private static void tulisData() {
System.out.println("Isi Stack adalah (menggunakan prosedur POP) : " );
int dataStack;
for (int i = 0; i < ukuran; i++) { dataStack = stack.pop();
System.out.println ("Nilainya = " + dataStack); }
}
private static Integer inputData() {
BufferedReader bfr = new BufferedReader(
new InputStreamReader(System.in)); String angkaInput = null;
try {
angkaInput = bfr.readLine(); } catch (IOException e) {
e.printStackTrace(); }
int Data = Integer.valueOf(angkaInput).intValue(); return Data;
}
private static void bacaData() { int data;
System.out.println("Masukkan nilai-nilai STACK : "); for (int i = 0; i < ukuran; i++) {
System.out.print("Data ke-" + (i + 1) + " : "); data = inputData();
stack.push(data); }
}
private static void buatStack() { stack = new Stack<Integer>(); }
}
Percobaan 2. Solusi Rekursif untuk Stack package myStack;
// Parameter-parameter yang akan disimpan di stack. public class Params {
int n; int codePart; int returnAddress; Params(int nn, int ra) {
n=nn;
returnAddress = ra; }
} // end class Params package myStack; public class StackX {
int maxSize; // Ukuran array stack. Params[] stackArray;
int top; // Bagian atas (top) stack
//--- public StackX(int s) {
maxSize = s; // Mengatur ukuran array.
stackArray = new Params[maxSize]; // Membuat array. top = -1; // Saat stack kosong.
}
//--- // Menaruh item di atas stack.
public void push(Params p) {
// Melakukan penambahan top; menyisipkan item. stackArray[++top] = p;
}
//--- // Mengambil item dari bagian atas (top) stack. public Params pop()
{
// Mengakses item, mengurangi nilai top. return stackArray[top--];
}
//--- // Melihat item di bagian atas stack.
public Params peek() {
return stackArray[top]; }
//--- } // end class StackX
package myStack;
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
public class StackTriangleApp {
static int theNumber; static int theAnswer; static StackX theStack; static int codePart;
static Params theseParams;
public static void main(String[] args) throws IOException
{
System.out.print
System.out.flush(); theNumber = getInt(); recTriangle(); System.out.println
("Bilangan segitiga Phytagoras = "+ theAnswer); } // Akhir metoda/fungsi main()
// --- public static void recTriangle()
{
theStack = new StackX(50); codePart = 1;
// Memanggil metoda step() hingga bernilai true. while( step() == false)
// Pernyataan kosong. ;
}
// --- public static boolean step()
{
switch(codePart) {
case 1: // Pemanggilan awal.
theseParams = new Params(theNumber, 6); theStack.push(theseParams);
codePart = 2; break;
case 2: // Jalan masuk metoda. theseParams = theStack.peek(); if(theseParams.n == 1) // Pengujian. {
theAnswer = 1;
codePart = 5; // Keluar (exit). }
else
codePart = 3; // Pemanggilan rekursif. break;
case 3: // Pemanggilan metoda. Params newParams =
new Params(theseParams.n - 1, 4); theStack.push(newParams);
codePart = 2; // Masuk ke metoda. break;
case 4: // Perhitungan.
theseParams = theStack.peek();
theAnswer = theAnswer + theseParams.n; codePart = 5;
break;
case 5: // Keluar (exit) metoda. theseParams = theStack.peek();
codePart = theseParams.returnAddress; // (4 atau 6) theStack.pop();
break;
case 6: // Titik kembali. return true;
} // end switch
return false; // Semua kecuali 7 } // end triangle
// --- public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr);
String s = br.readLine(); return s;
}
// --- public static int getInt() throws IOException
{
String s = getString(); return Integer.parseInt(s); }
// --- } // end class StackTriangleApp
// stackTriangle.java
Percobaan 3. Program simulasi Stack dengan teknik Rekursif package myStack;
public class StackX2 {
int maxSize; // Ukuran array stack. int[] stackArray;
int top; // Bagian atas (top) stack StackX2(int s) // constructor {
maxSize = s;
stackArray = new int[maxSize]; top = -1;
}
// Meletakkan item ke bagian atas (top) stack. public void push(int p) {
stackArray[++top] = p; }
// Mengambil item dari bagian atas (top) stack. public int pop() {
return stackArray[top--]; }
// Melihat item dari bagian atas (top) stack. public int peek() // peek at top of stack {
return stackArray[top]; }
// Menguji apakah stack kosong. public boolean isEmpty() {
return (top == -1); }
} // end class StackX package myStack;
import java.io.BufferedReader; import java.io.IOException;
import java.io.InputStreamReader; public class StackTriangleApp2 {
static int theNumber; static int theAnswer; static StackX2 theStack;
public static void main(String[] args) throws IOException { System.out.print("Masukkan bilangan : "); System.out.flush();
theNumber = getInt(); stackTriangle();
System.out.println("Bilangan segitiga Phytagoras = " + theAnswer);
} // end main()
// --- public static void stackTriangle() {
theStack = new StackX2(10000); // Membuat stack theAnswer = 0; // Menginisialisasi theAnswer while (theNumber > 0) // Hingga n bernilai 1, {
theStack.push(theNumber); // Memasukkan nilai. --theNumber; // Mengurangi nilai.
}
while (!theStack.isEmpty()) // Hingga stack kosong, {
int newN = theStack.pop(); // Mengeluarkan (pop) nilai, theAnswer += newN; // Menambah nilai theAnswer }
}
// --- public static String getString() throws IOException {
InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr);
String s = br.readLine(); return s;
}
// --- public static int getInt() throws IOException {
String s = getString(); return Integer.parseInt(s); }
}
Percobaan 4. Queue (Antrian) package queue; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; public class Antrian {
private static int ukuran;
private static Queue<Integer> queue; public static void main(String[] args) {
System.out.print("Berapa ukuran QUEUE diinginkan? "); ukuran = inputData();
buatQueue(); bacaData(); tulisData(); }
private static void buatQueue() {
queue = new LinkedList<Integer>(); }
private static int inputData() {
BufferedReader bfr = new BufferedReader(
new InputStreamReader(System.in)); String angkaInput = null;
try {
angkaInput = bfr.readLine(); } catch (IOException e) {
e.printStackTrace(); }
int Data = Integer.valueOf(angkaInput).intValue(); return Data;
private static void tulisData() { Integer data;
System.out.println("\nUrutan keluar elemen dari QUEUE : "); for (int i = 0; i < ukuran; i++) {
data = queue.remove();
System.out.println("Data ke-" + (i + 1) + " : " + data); }
data = queue.size();
System.out.println("Ukuran QUEUE sekarang adalah " + data); }
private static void bacaData() { Integer data;
for (int i = 0; i < ukuran; i++) {
System.out.print("Data ke-" + (i + 1) + " : "); data = inputData();
queue.add(data); }
data = queue.size();
System.out.println("Ukuran QUEUE sekarang adalah " + data); }
}
Percobaan 5. Sorting pada kelas Collection dan antarmuka comparable package collection; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Koleksi {
private static int ukuran;
private static Collection <String> cs; private static String stringInput; public static void main(String[] args) {
System.out.print("Berapa ukuran COLLECTION diinginkan? "); ukuran = inputData();
for (int i=0; i<ukuran; i++) { System.out.print
("Data ke-" + (i+1) + " (Masukkan string) : "); stringInput = bacaData();
cs.add(stringInput); }
tulisData(); }
private static void tulisData() {
Collections.sort((List<String>) cs); Iterator<String> it = cs.iterator();
System.out.println("\nDATA TERURUT DALAM COLLECTION : ");
while(it.hasNext()) {
System.out.println("Data : " + it.next()); }
}
private static int inputData() {
BufferedReader bfr = new BufferedReader(
new InputStreamReader(System.in)); String angkaInput = null;
try {
angkaInput = bfr.readLine(); } catch (IOException e) {
e.printStackTrace(); }
int Data = Integer.valueOf(angkaInput).intValue(); return Data;
}
private static String bacaData() { String data = null;
BufferedReader bfr = new BufferedReader(
new InputStreamReader(System.in)); String stringInput = null;
try {
stringInput = bfr.readLine(); } catch (IOException e) {
e.printStackTrace(); } data = String.valueOf(stringInput); return data; } } Percobaan 6. ArrayList package bynary_and_ArraySearchList; import java.util.*;
public class Insert_ArrayList_LinkedList { static final int N = 50000;
// Mencatat waktu yang diperlukan untuk menyisipkan // sejumlah N objek ke List.
static long timeList(List<Object> lst) {
long start = System.currentTimeMillis(); Object obj = new Object();
for (int i = 0; i < N; i++) { lst.add(0, obj); }
return System.currentTimeMillis() - start; }
public static void main(String args[]) { // Perhitungan waktu untuk ArrayList System.out.println("Time for ArrayList = "
+ timeList(new ArrayList<Object>())); // Perhitungan waktu LinkedList
System.out.println("Time for LinkedList = "
+ timeList(new LinkedList<Object>())); }
}
Percobaan 7. Binary Search Array List package bynary_and_ArraySearchList; import java.util.*;
public class BinarySearchArrayList { static final int N = 10000;
static List<Integer> values;
// Membuat nilai-nilai bilangan bulat acak sebanyak N. static {
Integer vals[] = new Integer[N]; Random rn = new Random();
for (int i = 0, currval = 0; i < N; i++) { vals[i] = new Integer(currval); currval += rn.nextInt(100) + 1; System.out.println
("Data ke-" + (i+1) + " adalah " + currval); }
values = Arrays.asList(vals); }
// Beriterasi sepanjang list dan mencari nilai tertentu // menggunakan metoda Binary Search.
static long timeList(List<Integer> lst) {
long start = System.currentTimeMillis(); for (int i = 0; i < N; i++) {
// Mencari nilai tertentu menggunakan metoda Binary Search.
int indx = Collections.binarySearch(lst, values.get(i)); // Jika terjadi kesalahan saat pencarian.
if (indx != i) {
System.out.println("*** error ***\n"); }
}
return System.currentTimeMillis() - start; }
public static void main(String args[]) { // Pencarian pada ArrayList
System.out.println("Waktu diperlukan pada pencarian ArrayList = "
+ timeList(new ArrayList<Integer>(values)) + " mikrodetik.");
// Pencarian pada LinkedList
System.out.println("Waktu diperlukan pada pencarian LinkedList = "
+ timeList(new LinkedList<Integer>(values)) + " mikrodetik."); } }
5. Tugas Praktikum
1. Buatlah program kalkulator sederhana (pengoperasian 2 bilangan aritmatika sederhana)!
Operasi aritmatika tersebut (dalam notasi infiks), harus diubah kedalam bentuk notasi postfiks.
Contoh: INFIKS POSTFIKS 3 + 7 3 7 + 2 – 9 2 9 - 8 * 7 8 7 * 9 / 3 9 3 / Misal : algoritma 3 7 +
indeks Stack process
2 + add
1 7 push operand