Stack
Stack
Stack atau tumpukan adalah struktur penyimpanan data dimana pemasukan dan
pengeluaran data dilakukan pada satu ujung yang sama. Contoh penyimpanan
dengan konsep stack dalam kehidupan sehari-hari adalah tumpukan piring pada
sebuah restoran. Pelayan akan mengambilkan piring satu per satu dari tumpukan
paling atas, mungkin sebelum tumpukan piringnya habis, tukang cuci piring akan
menambahkan piring bersih satu per satu diatas tumpukan piring yang paling atas.
Jika diperhatikan pada tumpukan piring tersebut, pemasukan (penambahan) dan
pengeluaran (penghapusan, pengambilan) piring selalu pada piring paling atas.
Inilah yang disebut dengan LIFO, yaitu Last-In-First-Out, artinya yang terakhir masuk,
menjadi yang pertama keluar.
Operasi yang bisa dilakukan pada sebuah stack (tumpukan) adalah :
1. createstack, yaitu membuat tumpukan baru, tentu saja mulai dari kosong.
2. isemptystack, yaitu memeriksa apakah stacknya kosong
3. isfullstack, yaitu memeriksa apakah stacknya penuh
4. clearstack, yaitu mengeluarkan seluruh isi stack
5. push, yaitu memasukkan sebuah piring kedalam stack, tentunya jika stack tidak
penuh.
6. pop, yaitu mengambil sebuah piring dari stack, tentunya jika stack tidak
kosong.
tstack {
data[1000];
size;
top;
Pada awal program utama, tentu harus dideklarasikan dahulu variabel (identifier)
untuk stack :
int main() {
tstack stack;
...
}
stack
stack.data[0]
stack.data[1]
..........
stack.data[999]
stack.size
stack.top
Saat ini hanya ada variabel stack yang belum memiliki data, ukuran maupun top.
Untuk meng-create stack perhatikan instruksi berikut :
tstack createstack(int ukuran) {
tstack s;
s.size = ukuran;
s.top = -1;
return s;
}
Kedua modul diatas memerlukan input berupa stack yang akan diperiksa penuh atau
kosong, dan mengembalikan nilai 1 atau 0. Jika hasil pemeriksaan adalah 1, artinya
benar dan 0 adalah sebaliknya. Maksudnya jika isemptystack mengembalikan nilai 1
artinya kosong, jika 0 tidak kosong. Jika isfullstack mengembalikan nilai 1 artinya
penuh, jika 0 artinya tidak penuh.
Operasi untuk memasukkan data pada sebuah stack sering disebut dengan push.
Operasi push hanya bisa dilakukan jika stack tidak penuh. Jika operasi push berhasil
dilakukan, maka akan dikembalikan nilai 1, selain itu dikembalikan nilai 0. Operasi ini
membutuhkan dua input, yaitu data yang akan dimasukkan dan stack yang dituju
(dikirimkan alamatnya, sehingga perubahan pada stack langsung ter-update). Maka
instruksi programnya adalah sebagai berikut.
int push(tstack *s, int data) {
if (isfullstack(*s)) return 0;
(*s).top++;
(*s).data[(*s).top] = data;
return 1;
}
Operasi untuk mengeluarkan data dari stack disebut pop. Operasi pop bisa dilakukan
jika stack tidak kosong. Jika pop berhasil dikembalikan nilai 1, selain itu dikembalikan
nilai 0. Operasi ini membutuhkan dua input, yaitu indentifier (variabel) untuk
menampung data yang dikeluarkan dan stack yang dituju (dikirimkan alamatnya,
sehingga perubahan pada stack langsung ter-update). Maka instruksi programnya
adalah sebagai berikut.
int pop(tstack *s, int *hasil) {
if (!isemptystack(*s)) {
*hasil = (*s).data[(*s).top];
(*s).top--;
return 1;
}
return 0;
}
Jika penggunaan stack telah selesai, sebaiknya stack dikosongkan kembali. Jika stack
diimplementasi menggunakan array static, tentunya tidak perlu membebaskan
memori yang dipakai. Dengan demikian yang perlu dilakukan hanya mengubah nilai
top menjadi -1.
void clearstack(tstack *s) {
(*s).top = -1;
}
Diatas telah dijelaskan mengenai 6 (enam) operasi dasar pada stack. Selain operasi
dasar tersebut, ada operasi lain seperti print stack, print top, print size, dan lain-lain.
Dengan adanya operasi-operasi tersebut, program utama tinggal memakai atau
memanggil operasi-operasi tersebut sesuai kebutuhan. Berikut ini adalah contoh
program sederhana beserta ilustrasinya.
Isi file stacksa.h (stack dengan static array)
# include <stdio.h>
typedef struct {
int data[1000],size,top;
} tstack;
tstack createstack(int ukuran) {
tstack s;
s.size=ukuran;
s.top = -1;
return s;
}
int isemptystack(tstack s) {
if (s.top == -1) return 1;
return 0;
}
int isfullstack(tstack s) {
if ((s.top + 1) == s.size) return 1;
return 0;
}
int push(tstack *s, int data) {
if (isfullstack(*s)) return 0;
(*s).top++;
(*s).data[(*s).top] = data;
return 1;
}
int pop(tstack *s, int *hasil) {
if (!isemptystack(*s)) {
*hasil = (*s).data[(*s).top];
(*s).top--;
return 1;
}
return 0;
}
void clearstack(tstack *s) { //pada array
(*s).top = -1;
}
Ilustrasi :
Kondisi stack setelah baris 6
stack
tampung
stack.data[0]
stack.data[1]
..........
stack.data[999]
stack.size
stack.top
10
-1
stack
tampung
stack.data[0]
stack.data[1]
..........
stack.data[999]
stack.size
stack.top
43
stack.data[0]
stack.data[1]
..........
stack.data[999]
stack.size
stack.top
43
81
stack.data[0]
stack.data[1]
stack.data[2]
..........
stack.data[999]
stack.size
stack.top
43
81
79
stack.data[0]
stack.data[1]
stack.data[2]
..........
stack.data[999]
stack.size
stack.top
43
81
10
0
stack
tampung
10
1
stack
tampung
10
2
stack
tampung
10
1
79
stack
tampung
stack.data[0]
stack.data[1]
..........
stack.data[999]
stack.size
stack.top
10
-1
Jika ukuran diberi nilai 5 (lima), maka ilustrasi stack adalah sebagai berikut :
[0]
stack
stack.data
stack.size
stack.top
[1]
[2]
[3]
[4]
5
-1
untuk simpul atau node. Selanjutnya top adalah sebuah pointer yang menunjuk
ke simpul atau node paling depan dari linked list.
struct tnode {
int data;
struct tnode *next;
};
typedef struct {
struct tnode *top;
int size;
} tstack;
Jika ukuran diberi nilai 5 (lima), maka ilustrasi stack adalah sebagai berikut :
stack
stack.size
stack.top
5
/
Jika dilakukan push dengan data 102, maka ilustrasi stack adalah sebagai
berikut :
stack
stack.size
stack.top
5
102 /
Jika dilakukan push dengan data 345, maka ilustrasi stack adalah sebagai
berikut :
stack
stack.size
stack.top
5
345
102 /
char huruf;
huruf = getche();
if (huruf != 13) membalik_string(flag);
if (*flag == 1) {
printf("\n");
*flag = 0;
}
printf("%c", huruf);
}
int main() {
int a = 1;
membalik_string(&a);
return 1;
}
References :
1. Ngoen, T.S., (2004), Data Structures, IBII Lecture Notes
2. Horowitz,E., Sahni,S. and Anderson-Freed,S.,(1993), Fundamentals of Data Structures in C,
Computer Science Press,New York.
3. Mark Allen Weiss, 1997, Data Structures and Algorithm Analysis in C, Addison Wesley Longman,
inc.