Stack dan Que Que
- STACK DAN QUEUE DENGAN LINKED
LIST
Pengertian
Linked list :
- sekumpulan elemen bertipe sama, yang mempunyai
keterurutan tertentu, yang setiap elemennya terdiri dari dua bagian
- struktur berupa rangkaian elemen saling berkait dimana
setiap elemen dihubungkan elemen lain melalui pointer. Pointer adalah
alamat elemen. Penggunaan pointer untuk mengacu elemen berakibat
elemen-elemen bersebelahan secara logik walau tidak bersebelahan secara
fisik di memori.
Bentuk Umum :
Infotype
àsebuah tipe terdefinisi yang menyimpan informasi sebuah
elemen list
Next
àaddress dari elemen berikutnya (suksesor)
Jika
L adalah list, dan P adalah address, maka alamat elemen pertama list L dapat
diacu dengan notasi :
Sebelum
digunakan harus dideklarasikan terlebih dahulu :
Elemen
yang diacu oleh P dapat dikonsultasi informasinya dengan notasi :
Beberapa
Definisi :
- List l adalah list kosong, jika
First(L) = Nil
- Elemen terakhir dikenali,
dengan salah satu cara adalah karena
Next(Last) = Nil
Nil
adalah pengganti Null, perubahan ini dituliskan dengan #define Nil Null
Single Linked List
Pada
gambar di atas tampak bahwa sebuah data terletak pada sebuah lokasi memori
area. Tempat yang disediakan pada satu area memori tertentu untuk menyimpan
data dikenal dengan sebutan node atau simpul. Setiap node memiliki pointer yang
menunjuk ke simpul berikutnya sehingga terbentuk satu untaian, dengan demikian
hanya diperlukan sebuah variabel pointer. Susunan berupa untaian semacam ini
disebut Single Linked List (NULL memilik nilai khusus yang artinya tidak menunjuk
ke mana-mana. Biasanya Linked List pada titik akhirnya akan menunjuk ke NULL).
Pembuatan
Single Linked List dapat menggunakan 2 metode:
- LIFO (Last In First Out), aplikasinya : Stack
(Tumpukan)
- FIFO (First In First Out), aplikasinya : Queue (Antrean)
Double
Linked List
Salah
satu kelemahan single linked list adalah pointer (penunjuk) hanya dapat
bergerak satu arah saja, maju/mundur, atau kanan/kiri sehingga pencarian data
pada single linked list hanya dapat bergerak dalam satu arah saja. Untuk mengatasi
kelemahan tersebut, dapat menggunakan metode double linked list. Linked list
ini dikenal dengan nama Linked list berpointer Ganda atau Double Linked List.
Circular
Double Linked List
Merupakan
double linked list yang simpul terakhirnya menunjuk ke simpul terakhirnya
menunjuk ke simpul awalnya menunjuk ke simpul akhir sehingga membentuk suatu
lingkaran.
Operasi-Operasi yang ada pada Linked List
- Insert
Istilah Insert berarti menambahkan sebuah simpul baru ke
dalam suatu linked list.
- IsEmpty
Fungsi ini menentukan apakah linked list kosong atau tidak.
- Find First
Fungsi ini mencari elemen pertama dari linked list
- Find Next
Fungsi ini mencari elemen sesudah elemen yang ditunjuk now
- Retrieve
Fungsi ini mengambil elemen yang ditunjuk oleh now. Elemen
tersebut lalu dikembalikan oleh fungsi.
- Update
Fungsi ini mengubah elemen yang ditunjuk oleh now dengan isi
dari sesuatu
- Delete Now
Fungsi ini menghapus elemen yang ditunjuk oleh now. Jika
yang dihapus adalah elemen pertama dari linked list (head), head akan
berpindah ke elemen berikut.
- Delete Head
Fungsi ini menghapus elemen yang ditunjuk head. Head
berpindah ke elemen sesudahnya.
- Clear
Fungsi ini menghapus linked list yang sudah ada. Fungsi ini
wajib dilakukan bila anda ingin mengakhiri program yang menggunakan linked
list. Jika anda melakukannya, data-data yang dialokasikan ke memori pada
program sebelumnya akan tetap tertinggal di dalam memori.
A. STACK DENGAN
SINGLE LINKED LIST
Selain implementasi stack dengan array seperti telah
dijelaskan sebelumnya, stack daat diimplementasikan dengan single linked list.
Keunggulannya dibandingkan array adalah penggunaan alokasi memori yang dinamis
sehingga menghindari pemborosan memori.
Misalnya pada stack dengan array disediakan tempat untuk
stack berisi 150 elemen, sementara ketika dipakai oleh user stack hanya diisi
50 elemen, maka telah terjadi pemborosan memori untuk sisa 100 elemen, yang tak
terpakai. Dengan penggunaan linked list maka tempat yang disediakan akan sesuai
dengan banyaknya elemen yang mengisi stack.
Dalam stack dengan linked list tidak ada istilah full,
sebab biasanya program tidak menentukan jumlah elemen stack yang mungkin ada
(kecuali jika sudah dibatasi oleh pembuatnya). Namun demikian sebenarnya stack
ini pun memiliki batas kapasitas, yakni dibatasi oleh jumlah memori yang
tersedia.
Operasi-operasi
untuk Stack dengan Linked List
- IsEmpty
Fungsi memeriksa apakah stack yang adamasih kosong.
- Push
Fungsi memasukkan elemen baru ke dalam stack. Push di sini
mirip dengan insert dalam single linked list biasa.
- Pop
Fungsi ini mengeluarkan elemen teratas dari stack.
- Clear
Fungsi ini akan menghapus stack yang ada.
B.
QUEUE DENGAN DOUBLE LINKED LIST
Selain
menggunakan array, queue juga dapat dibuat dengan linked list. Metode linked
list yang digunakan adalah double linked list.
Operasi-operasi
Queue dengan Double Linked List
- IsEmpty
Fungsi IsEmpty berguna untuk mengecek apakah queue masih
kosong atau sudah berisi data. Hal ini dilakukan dengan mengecek apakah head
masih menunjukkan pada Null atau tidak. Jika benar berarti queue masih kosong.
- IsFull
Fungsi IsFull berguna untuk mengecek apakah queue sudah
penuh atau masih bisa menampung data dengan cara mengecek apakah Jumlah Queue
sudah sama dengan MAX_QUEUE atau belum. Jika benar maka queue sudah penuh.
- EnQueue
Fungsi EnQueue berguna untuk memasukkan sebuah elemen ke
dalam queue (head dan tail mula-mula meunjukkan ke NULL).
- DeQueue
Procedure DeQueue berguna untuk mengambil sebuah elemen dari
queue. Hal ini dilakukan dengan cara menghapus satu simpul yang terletak paling
depan (head).
- STACK DAN QUEUE DENGAN ARRAY
- STACK DENGAN MENGGUNAKAN ARRAY
Pengertian
Stack
- Stack atau tumpukan adalah
suatu stuktur data yang penting dalam pemrograman
- Bersifat LIFO (Last In First
Out)
- Benda yang terakhir masuk ke
dalam stack akan menjadi benda pertama yang dikeluarkan dari stack
- Contohnya, karena kita menumpuk
Compo di posisi terakhir, maka Compo akan menjadi elemen teratas dalam
tumpukan. Sebaliknya, karena kita menumpuk Televisi pada saat pertama
kali, maka elemen Televisi menjadi elemen terbawah dari tumpukan. Dan jika
kita mengambil elemen dari tumpukan, maka secara otomatis akan terambil
elemen teratas, yaitu Compo juga.
Operasi-operasi/fungsi
Stack
- Push : digunakan untuk menambah item
pada stack pada tumpukan paling atas
- Pop : digunakan untuk mengambil item
pada stack pada tumpukan paling atas
- Clear : digunakan untuk mengosongkan
stack
- IsEmpty : fungsi yang digunakan untuk
mengecek apakah stack sudah kosong
- IsFull : fungsi yang digunakan untuk
mengecek apakah stack sudah penuh
Stack with
Array of Struct
- Definisikan Stack dengan
menggunakan struct
- Definisikan MAX_STACK untuk
maksimum isi stack
- Buatlah variabel array data
sebagai implementasi stack secara nyata
- Deklarasikan
operasi-operasi/function di atas dan buat implemetasinya
Deklarasi
MAX_STACK
#define
MAX_STACK 10 //hati-hati mulai dari 0 jadi 0-9
Deklarasi STACK dengan struct dan array data
typedef
struct STACK{
int
top;
char
data[10][10]; //misalkan : data adalah array of string
//berjumlah
10 data, masing-masing string
//menampung
maksimal 10 karakter
};
Deklarasi/buat
variabel dari struct
STACK tumpuk;
Inisialisasi
Stack
- Pada mulanya isi top dengan -1,
karena array dalam C dimulai dari 0, yang berarti stack adalah KOSONG!
- Top adalah suatu variabel
penanda dalam STACK yang menunjukkan elemen teratas Stack sekarang. Top Of
Stack akan selalu bergerak hingga mencapai MAX of STACK sehingga
menyebabkan stack PENUH!
- Ilustrasi stack pada saat
inisialisasi:
Fungsi IsFull
- Untuk memeriksa apakah stack
sudah penuh?
- Dengan cara memeriksa top of
stack, jika sudah sama dengan
MAX_STACK-1 maka full, jika belum (masih lebih kecil dari
MAX_STACK-1) maka belum full
- Ilustrasi:
Fungsi IsEmpty
- Untuk memeriksa apakah stack
masih kosong?
- Dengan cara memeriksa top of
stack, jika masih -1 maka berarti stack masih kosong!
- Program:
Fungsi Push
- Untuk memasukkan elemen ke
stack, selalu menjadi elemen teratas stack
- Tambah satu (increment) nilai
top of stack terlebih dahulu setiap kali ada penambahan elemen stack,
asalkan stack masih belum penuh, kemudian isikan nilai baru ke stack
berdasarkan indeks top of stack setelah ditambah satu (diincrement)
- Ilustrasinya:
Fungsi Pop
- Untuk mengambil elemen teratas
dari stack.
- Ambil dahulu nilai elemen
teratas stack dengan mengakses top of stack, tampilkan nilai yang akan
diambil terlebih dahulu, baru didecrement nilai top of stack sehingga
jumlah elemen stack berkurang
- Ilustrasinya:
Programnya:
Fungsi Print
- Untuk menampilkan semua
elemen-elemen stack
- Dengan cara looping semua nilai
array secara terbalik, karena kita harusmengakses dari indeks array
tertinggi terlebih dahulu baru ke indeks yang kecil!
Program:
- QUEUE DENGAN MENGGUNAKAN ARRAY
- Queue = Antrian
- Elemen yang pertama kali masuk
ke antrian akan keluar pertama kalinya
- DEQUEUE adalah mengeluarkan
satu elemen dari suatu Antrian
- Antrian dapat dibuat dengan
menggunakan: Liniear Array dan Circular
Array
QUEUE DENGAN
LINIEAR ARRAY
- Terdapat satu buah pintu masuk
di suatu ujung dan satu buah pintu keluar
di ujung satunya
- Sehingga membutuhkan variabel
Head dan Tail
DEKLARASI QUEUE
OPERASI-OPERASI
PADA QUEUE
- Create()
o
Untuk menciptakan dan menginisialisasi Queue
o
Dengan cara membuat Head dan Tail = -1
- IsEmpty()
o
Untuk memeriksa apakah Antrian sudah penuh atau belum
o
Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty
o
Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala
antrian
(elemen pertama dalam antrian) yang tidak akan berubahubah
o
Pergerakan pada Antrian terjadi dengan penambahan elemen
Antrian
kebelakang, yaitu menggunakan nilai Tail
- IsFull()
o
Untuk mengecek apakah Antrian sudah penuh atau belum
o
Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1
adalah
batas elemen array pada C) berarti sudah penuh
- Enqueue(data)
o
Untuk menambahkan elemen ke dalam Antrian, penambahan
elemen
selalu ditambahkan di elemen paling belakang
o
Penambahan elemen selalu menggerakan variabel Tail dengan cara
increment
counter Tail
-
Dequeue()
o Digunakan untuk menghapus elemen
terdepan/pertama dari Antrian
o Dengan cara mengurangi counter
Tail dan menggeser semua
elemen antrian kedepan.
o Penggeseran dilakukan dengan
menggunakan looping
- Clear()
o Untuk menghapus elemen-elemen
Antrian dengan cara membuat
Tail dan Head = -1
o Penghapusan elemen-elemen Antrian
sebenarnya tidak menghapus
arraynya, namun hanya mengeset
indeks pengaksesan-nya ke nilai
-1 sehingga elemen-elemen Antrian
tidak lagi terbaca
- Tampil()
o Untuk menampilkan nilai-nilai
elemen Antrian
o Menggunakan looping dari head s/d
tail
PEMBAHASAN
Perbandingan Antara
Stack-Queue Dengan Linked List Vs Stack-Queue Dengan Array
- Stack Dengan Linked List VS
Stack Dengan Array
Berikut ini adalah perbandingan algoritma pada
operasi-operasi dasar dari Stack Dengan Linked List dan Stack Dengan Array,
dengan menggunakan bahasa pemrograman Pascal
Stack Dengan Linked List
|
Stack Dengan Array
|
operasi : create()
|
|
procedure
create;
begin
top
:= nil ;
end;
|
procedure
create;
begin
top
:= 0;
end;
|
operasi : empty()
|
|
function
empty : boolean;
begin
empty
:= false ;
if
top = nil then empty := true ;
end;
|
function
empty : boolean;
begin
empty
:= false ;
if
top = 0 then empty := true ;
end;
|
operasi : full()
|
|
tidak
ada istilah full pada stack.
program tidak menentukan jumlah elemen stack yang mungkin
ada. kecuali dibatasi oleh pembuat program dan jumlah memory yang tersedia.
tempat akan sesuai dengan banyaknya elemen yang mengisi stack.
|
function
full : boolean;
begin
full
:= false ;
if
top = max then full := true ;
end;
|
operasi : push()
|
|
procedure
push (elemen : typedata) ;
var
now:point ;
begin
now(now)
;
now^.isi
:= elemen ;
if
empty then
now^.next
:= nil ;
else
now^.next
:= top ;
top
:= now ;
end;
|
procedure
push (elemen : typedata) ;
begin
if
not full then
begin
top
:= top + 1 ;
stack
[top] := elemen ;
end;
end;
|
operasi : pop()
|
|
procedure
pop (var elemen : typedata) ;
var
now:point ;
begin
if
not empty then
begin
elemen
:= now^.isi ;
now
:= top ;
top
:= top^.next ;
dispose(now)
;
end;
end;
|
procedure
pop (elemen : typedata) ;
begin
if
not empty then
begin
elemen
:= stack [top] ;
top
:= top – 1 ;
end;
end;
|
operasi : clear
|
|
procedure
clear ;
var
trash : typedata ;
begin
while
not empty do pop(trash) ;
end;
|
procedure
clear ;
begin
top
:= 0 ;
end;
|
PEMBAHASAN
Dari
perbandingan diatas, dapat dilihat pada linked list tidak dikenal istilah full.
Hal ini berkaitan dengan penggunaan alokasi memori pada linked list yang lebih
dinamis jika dibandingkan dengan array, sehingga pemborosan memory dapat
dihindari. Program tidak menentukan jumlah elemen stack yang mungkin ada.
Kecuali dibatasi oleh pembuat program dan jumlah memory yang tersedia. Tempat
akan sesuai dengan banyaknya elemen yang mengisi stack.
- Queue Dengan Linked List VS
Queue Dengan Array
Implementasi
queue menggunakan array
- Implementasi sederhana
- Ukuran memori harus ditentukan
ketika sebuah objek queue dideklarasikan
- Pemborosan tempat (memori)
ketika menggunakan jumlah data yang lebih sedikit dari alokasi memori
- Tidak dapat menambahkan data
melebihi maksimal ukuran array yang telah dideklarasikan
Implementasi
queue menggunakan linked list
- Pengalokasian memori dinamis
- Menggunaka 2 buah pionter, qFront
dan qRear, untuk menandai posisi depan dan belakang dari queue
Perbandingan
implementasi queue, array VS linked list (contoh 1)
- Memory requirements
- Array-based implementation
- Diasumsikan ukuran queue 100
(string @80bytes)
- Diasumsikan index membutuhkan
2 bytes
- Total memory: (80 bytes x 101
slots) + (2 bytes x 2 indexes) = 8084 bytes
- Linked-list-based
implementation
- Diasumsikan pointers
membutuhkan 4 bytes
- Total memory per node: 80
bytes + 4 bytes = 84 bytes
Gambar :
Perbandingan
implementasi queue, array VS linked list (contoh 2)
- Memory requirements
- Array-based implementation
- Diasumsikan ukuran queue 100
(string @2bytes)
- Diasumsikan index membutuhkan
2 bytes
- Total memory: (2 bytes x 101
slots) + (2 bytes x 2 indexes) = 206 bytes
- Linked-list-based
implementation
- Diasumsikan pointers
membutuhkan 4 bytes
- Total memory per node: 2
bytes + 4 bytes = 6 bytes
Gambar :
KESIMPULAN
Perbandingan
Antara Stack-Queue Dengan Linked List Vs Stack-Queue Dengan Array
- Untuk stack dan queue yang
berukuran besar, terutama jumlah maksimal data tidak diketahui, lebih baik
menggunakan linked list.
- Untuk perangkat yang memiliki
memori terbatas, seperti small handheld devices, linked list memiliki
performa yang lebih bagus.
Komentar
Posting Komentar