MODUL PERKULIAHAN
Algoritma Pemrograman & Struktur Data Stack
Fakultas
Program Studi
Fakultas Ilmu Komputer
Informatika
Tatap Muka
04
Kode MK
Disusun Oleh
87042
Rinto Priambodo, ST, MTI
Abstract
Kompetensi
Penjelasan mengenai stack dan penggunaannya
Memahami definisi stack dan penggunaannya dalam pemrograman
Pembahasan Stack Stack adalah algoritma untuk menyimpan data. Stack memiliki operasi push untuk memasukkan data ke dalam stack dan pop untuk mengeluarkan data. Keluar dan masuknya data menggunakan prinsip LIFO (Last-In-First-Out). Artinya elemen yang terakhir masuk adalah yang bisa dikeluarkan pertama kali. Jika dibayangkan berupa sebuah list, maka stack adalah list yang terdiri atas sederet elemen tapi hanya bisa menambahkan atau menghapus elemen dari salah satu ujungnya saja. Pop 5 3
Push
7 Gambar 1 Ilustrasi stack Misalnya kita memiliki sebuah stack yang kosong. Lalu kita memasukkan tiga buah elemen yang memiliki nilai 4, 5, dan 8. Elemen tersebut dimasukkan satu persatu dengan operasi push. Setelah 4, 5, dan 8 dimasukkan berurutan. Maka operasi pop berikutnya akan memberikan nilai 8 dan meninggalkan elemen 4 dan 5 di dalam stack. Jika dilakukan pop lagi akan memberikan nilai 5 dan meninggalkan 4 di dalam stack. Lalu kita masukkan elemen baru ke dalam stack, yaitu 9. Lakukan pop lagi akan memberikan nilai 9 dan pop berikutnya memberikan nilai 4. Setelah itu stack menjadi kosong kembali. Contoh ini digambarkan dalam tabel berikut ini: Operation
Stack after operation
Push(4)
4
Push(8)
8 5 4
Push(5) Pop() Pop()
Push(9) Pop Pop
2014
5 4 5 4 4
9 4 4
<empty>
2
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
Selain Push dan Pop, operasi yang biasa digunakan dalam penggunaan stack adalah Top dan isEmpty. Jika contoh di atas kita tulis ulang menggunakan Top dan isEmpty akan menjadi sebagai berikut: Operation
Stack after operation
Push(4)
4
Push(8)
8 5 4
Push(5)
5 4
Pop() 8
5 4
Top() 5
5 4
Push(9)
9 4
Pop()
isEmpty() false Pop
4
9 4 4
Pop
<empty>
isEmpty()
<empty>
true
Untuk implementasi stack dalam aplikasi, metode stack dapat digunakan untuk fungsi ‘undo’ seperti dalam aplikasi editor. Dalam fungsi ‘undo’ tersebut kita hanya perlu untuk menambahkan atau mengambil nilai yang ada di salah satu ujung dalam daftar. Seluruh operasi stack harus membutuhkan waktu yang konstan atau O(1). Dengan demikian berapapun elemen yang ada dalam stack tidak boleh mempengaruhi besarnya waktu yang dibutuhkan untuk melakukan operasi Push ataupun Pop.
2014
3
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
Implementasi Stack menggunakan Array Stack dapat diimplementasikan menggunakan array karena stack dan array adalah samasama merupakan list di mana di dalamnya ada sederet elemen. Dalam array juga dimungkinkan operasi-operasi untuk menambahkan atau menghapus elemen di salah satu ujungnya. Dengan demikian array bisa digunakan untuk mengimplementasikan stack. Berikut ini adalah contoh implementasi stack menggunakan array: 2
10
5
0
1
2
3
4
5
6
7
8
9
Pseudo code: int A[10] top -1
Push(x) { top top + 1 }
A[top] x
Pop() { }
top top-1
Setelah melakukan inisialisasi array dengan mengalokasikan 10 elemen, variabel top (bukan fungsi Top) diisi dengan nilai -1 yang menunjukkan bahwa stack tersebut masih kosong. Dalam fungsi Push yang berfungsi untuk menambahkan sebuah elemen, terlebih dahulu variabel top ditambahkan dengan nilai satu dan elemen baru dimasukkan ke dalam array menggunakan indeks sesuai nilai top. Dalam fungsi Pop, untuk mengurangi sebanyak satu elemen kita cukup menggeser posisi top atau dengan kata lain mengurangi nilai top sebanyak 1. Operasi Push dan Pop dalam contoh ini membutuhkan waktu yang konstan berapapun jumlah elemennya selama jumlah seluruh elemennya tidak lebih dari 10 elemen. Apabila operasi Push dilakukan saat elemen sudah berjumlah 10 maka array tersebut tidak lagi mencukupi dan mengalami overflow. Akibatnya ukuran array harus diperbesar. Kita harus membuat array baru yang lebih besar dan mengkopi seluruh elemen dari array yang lama ke dalam array yang baru. Bila ini terjadi maka operasi Push tidak lagi membutuhkan waktu yang konstan tetapi tergantung pada jumlah elemen yang harus dipindahkan.
2014
4
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
Untuk melengkapi pseudo code di atas kita akan menambahkan fungsi Top dan isEmpty seperti berikut: Top() { }
return A[top]
isEmpty() {
if (top == -1) else
}
return true return false
Operasi Top mengembalikan nilai dari array A pada indeks yang disimpan dalam variabel global top. Sementara itu fungsi isEmpty mengecek apakah variabel top berisi nilai -1 di mana berarti stack dalam kondisi kosong. Berikut ini adalah contoh implementasi stack menggunakan array dalam bahasa C++ #include <stdio.h>
#define MAX_SIZE 101 int A[MAX_SIZE]; int top=-1;
void Push(int x) {
if(top==MAX_SIZE -1) { printf("ERROR");
} }
return;
A[++top] = x;
void Pop() {
if (top == -1) {
printf("ERROR");
} }
2014
5
return;
top--;
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
void Print() { int i;
for(i=0;i<=top;i++)
printf("%d",A[i]);
printf("\n");
}
int main() {
Push(2); Print(); Push(5); Print();
Push(10); Print(); Pop(); Print();
Push(12); Print();
}
Apabila program tersebut dijalankan akan menampilkan angka-angka seperti berikut: 2
25
2510 25
2512 Fungsi Print() sebenarnya bukan operasi dasar stack. Fungsi Print() dalam contoh di atas digunakan hanya untuk menampilkan isi stack ke layar.
2014
6
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
Implementasi Stack menggunakan Linked List Stack juga dapat diimplementasikan menggunakan linked list. Di bawah ini adalah contoh sebuah linked list. Untuk mengimplementasikan sebuah linked list sebagai sebuah stack, kita harus dapat menambahkan elemen di salah satu ujungnya. Untuk linked list berarti pilihannya adalah pada head atau tail. Dalam linked list jika kita ingin menambahkan elemen pada bagian tail kita harus mencari terlebih dahulu lokasi dari tail. Caranya adalah dengan cara menelusuri tiap elemen satu persatu dari head. Dengan demikian untuk menambahkan sebuah elemen pada tail akan membutuhkan waktu yang banyaknya bergantung pada banyaknya elemen dalam linked list tersebut. Begitu pula jika kita ingin menghapus elemen terakhir dari linked list. Pertama kita harus menemukan lokasinya terlebih dahulu dengan cara menelusuri tiap elemen satu persatu hingga menemukan bagian akhir. Kemudian baru kita bisa menghapus elemen terakhir tersebut dan menggantikannya dengan elemen sebelumnya. Dengan demikian untuk menghapus sebuah elemen di bagian akhir linked list juga akan membutuhkan waktu yang besarnya bergantung pada banyaknya elemen dari linked list tersebut. Hal ini tidak bisa diterima karena operasi stack membutuhkan waktu yang konstan, yaitu harus selalu sama berapapun jumlah elemen yang ada dalam list tersebut. 2
200 100
4
400
7
200
0
NULL
5
NULL
400
350
Berbeda dengan apabila kita menambahkan atau mengurangi elemen di awal linked list atau dengan kata lain pada bagian head. Untuk itu kita tinggal mengubah alamat yang disimpan sebagai head dan menggantinya dengan alamat dari elemen yang baru. Begitu pula dengan elemen yang baru, alamat pointer berikutnya diisi dengan alamat elemen yang sebelumnya menjadi head. Dengan demikian untuk menambahkan maupun mengurangi elemen pada bagian head dari sebuah linked list akan membutuhkan waktu yang konstan dan tidak tergantung pada banyaknya elemen dari linked list tersebut
2014
7
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
2
200
4
100
5
400
7
200
0
NULL
400
100 350
Berikut ini adalah contoh implementasi stack menggunakan linked list dalam bahasa C++: #include
#include <stdlib.h> struct node {
int data;
};
node* next;
node* top = NULL;
void Push(int x) {
node* newTop = (node*)malloc(sizeof(struct node*)); newTop->data = x;
newTop->next = top; }
top = newTop;
void Pop() {
node *temp;
if (top==NULL) return; temp = top;
top = top->next; }
2014
8
free(temp);
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
void displayStack() {
node* currNode = top;
cout << "Stack:" << endl;
while(currNode->next != NULL) {
cout << currNode->data << endl;
} }
currNode = currNode->next;
cout << currNode->data << endl;
int main() {
Push(2);
Push(4); Push(9);
displayStack(); Pop();
displayStack(); Pop();
displayStack(); }
return 0;
Apabila program tersebut dijalankan akan menampilkan angka-angka seperti berikut: Stack: 9 4 2
Stack: 4 2
Stack: 2
2014
9
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id
Daftar Pustaka Oualline, S. (1995), Practical C+ Programming,O’Reilly & Associates, Inc.
2014
10
Algoritma Pemrograman dan Struktur Data Rinto Priambodo, ST, MTI
Pusat Bahan Ajar dan eLearning http://www.mercubuana.ac.id