STRUKTUR DATA
PENYUSUN:
STACK : <192028> <Andi Hasriadi Putra>
QUEUE: <192010> <A. Nur Fadli Dzil Jalal>
LINKED LIST: <192031k> <Marvin Mathwell K.>
BINARY TREE: <192021> <Ahmad Rafiuddin>
a. Konsep stack
Dari penerapan di atas bisa di simpulkan bahwa stack itu mempunyai
konsep LIFO (Last In First Out) artinya terakhir kali di masukkan akan
keluar dahulu, maksudnya jika kita membuat tumpukan dari atas ke bawah
seperti penerapan di atas, maka Ketika kita mengambil satu persatu
tumpukan tersebut pasti dari atas ke bawah bukan? Tidak mungkin dari
bawah ke atas karena akan menghambat waktu.
1. Create(Stack)
Operasi Create(Stack) digunakan untuk membuat
suatu stack baru dengan nama stack, yang nilai elemen
saat stack tersebut dibuat adalah NOEL(S) = 0, TOP(S) = NULL (tidak
terdefinisikan)
2. IsEmpty(Stack)
Operasi ini merupakan operasi untuk mencek isi dari
suatu stack dalam keadaan kosong atau berisi. Operasi ini memiliki 2
(dua) kondisi boolean yaitu :
a. True jika stack tersebut kosong atau dapat dikatakan NOEL(S) = 0
b.False jika stack tersebut tidak dalam kondisi kosong atau dapat
dikatakan NOEL(S) > 0c)
3. Push(Stack, Elemen)
Operasi ini merupakan operasi untuk menambahkan satu elemen
dengan nilai X pada puncak suatu stack, sehingga posisi TOP(S) akan
bernilai X, penerapan operasi push pasa suatu stack S akan berakibat
overflow jika NOEL(S) dari stack tersebut telah bernilai maksimum.
4. Pop(Stack)
Operasi ini berfungsi untuk menghapus satu elemen dari stack S,
sehingga posisi NOEL(S) akan berkurang satu elemen, dan TOP(S)
akan berubah. Operasi pop dapat menyebabkan kondisi underflow jika
suatu stack S yang berada dalam kondisi minimum dikenakan operasi
pop.
Program untuk menampilkan kode pos (zip code) dari suatu negara
bagian dan kota dan semua inf ormasi tersebut dimasukkan ke dalam sebuah
tumpukan. Apabila tidak ada keterangan yang dimasukkan berarti tumpukan
kosong. Tekan q jika akan keluar.
//Program:stack2.cpp
#include
#include
#include
#include
#define MAX_CITY 30
#define MAX_STATE 30
#define MAX_ZIP 5
void main (void);
int is_empty (struct node *);
int push (struct node **);
int pop (struct node **);
void search (struct node **);
void free_nodes (struct node **pstack);
struct node {
char zip_code[MAX_ZIP+1];
char city[MAX_CITY];
char state[MAX_STATE];
struct node *link;
};
void main (void)
{
struct node *pstack = NULL;
int ok_so_far = 1, no_of_nodes = 0;
while (ok_so_far == 1) {
ok_so_far = push(&pstack);
if (ok_so_far == 1)
no_of_nodes ++;
else if(ok_so_far == 0) {
puts("\nAn unexpected error has occurred - terminating program");
exit(1); //Abort program
}
}
search (&pstack); //search linked list
free_nodes(&pstack); //release memory back to OS when done
}
int push(struct node **pstack)
{
struct node *new_ptr; //pointer for new struct
new_ptr = (struct node *) malloc(sizeof(struct node)); //memory for new node
if(new_ptr == (struct node *) NULL) //if malloc returns NULL
{
printf("ERROR! Unable to allocate memory - Abort\n");
free(new_ptr);
return (0); //return 0 so calling function knows an error occurred
}
else
{
printf("\n\nEnter %d digit zip code or 'q' to quit>>", MAX_ZIP);
gets(new_ptr->zip_code); //input zip code
new_ptr->zip_code[MAX_ZIP] = '\0'; //NULL to 6th char in zip_code
if (strcmp(new_ptr->zip_code, "q") != 0) {
printf("\nEnter a less than %d character state name>>\n",
MAX_STATE);
Modul 7 Struktur Data (Arie) - 7
gets(new_ptr->state); //input state
printf("\nEnter a less than %d character city name>>\n",
MAX_CITY);
gets(new_ptr->city); //input city
new_ptr->link = *pstack;
*pstack = new_ptr;
return (1); //return 1 so calling func will continue to loop
}
else return (2); //return 2 so calling func to stop looping
}
}
void search (struct node **pstack)
{
struct node *ptemp;
int test = 0;
char ch, find[6];
ptemp = *pstack;
printf("\n\nEnter %d digit zip code to search for \nor 'e' to print entire list>>",
MAX_ZIP);
gets(find); //input zip code
find[MAX_ZIP] = '\0'; //assign NULL to 6th char in find array
if (find[0] =='E' || find[0] =='e') //if user wants to view entire list
{
test = 1;
while (test != 0) //while stack is not empty print
test = pop (pstack); //info from stack and free nodes
}
else //otherwise search for zip code
{
while (test == 0 || ptemp != NULL) //while not found nor at the end of
list
{
if (strcmp(ptemp->zip_code, find) == 0)
{
test = 1;
printf("Zip Code: %s\n", ptemp->zip_code);
printf("State: %s\n", ptemp->state);
printf("City: %s\n\n", ptemp->city);
}
else if (ptemp == NULL)
{
printf("The zip code %s was not found.\n", find);
test = 1;
}
ptemp = ptemp->link;
}
puts ("\nType 'y' if you would you like to see the entire list");
puts ("or any other key to continue>>");
if (ch == 'y' || ch == 'Y')
{
test = 1;
while (test != 0)
test = pop (pstack);
}
}
}
Modul 7 Struktur Data (Arie) - 8
int pop (struct node **pstack)
{
struct node *temp;
if (is_empty(*pstack)== 1)
{
printf("\nStack is now empty");
return(0);
}
else
{
temp = *pstack;
printf("Zip Code: %s\n", temp->zip_code);
printf("State: %s\n", temp->state);
printf("City: %s\n\n", temp->city);
*pstack = (*pstack)->link;
free(temp);
return(1);
}
}
int is_empty (struct node *stack) //test if stack points to NULL
{
if (stack == NULL)
return(1); //if stack does point to NULL return 1 or true
return(0); //othrewise stack is not empty
}
void free_nodes (struct node **pstack)
{
struct node *temp; //temp pointer used for free()ing memory
while (*pstack != NULL)
{
temp = *pstack;
*pstack = (*pstack)->link;
free(temp); //release popped node's memory back to Operating System
}
}
e. Sumber/referensi
• https://kurniawandanie.blogspot.com/
• https://www.ismynr.xyz/2018/10/contoh-program-stack-c-penjelasan.html
• https://www.yudana.id/belajar-stack-dan-queue-dalam-struktur-data/
• https://strukdatfikupn.blogspot.com/2011/03/stack-tumpukan.html
2. Antrian Queue
Queue pada Struktur Data atau antrian adalah sekumpulan data yang
mana penambahan elemen hanya bisa dilakukan pada suatu ujung disebut
dengan sisibelakang(rear), dan penghapusan(pengambilan elemen) dilakukan
lewat ujung lain (disebut dengan sisi depan atau front).
Pada Stack atau tumpukan menggunakan prinsip“Masuk terakhir keluar
pertama”atau LIFO (Last In First Out), Maka pada Queue atau antrian prinsip
yang digunakan adalah “Masuk Pertama Keluar Pertama” atau FIFO (First In
First Out).
Queue atau antrian banyak kita jumpai dalam kehidupan sehari-hari, ex:
antrian Mobil diloket Tol, Antrian mahasiswa Mendaftar, dll.
Contoh lain dalam bidang komputer adalah pemakaian sistem komputer
berbagi waktu(time-sharing computer system) dimana ada sejumlah pemakai
yang akan menggunakan sistem tersebut secara serempak.
Pada Queue atau antrian Terdapat satu buah pintu masuk di suatu ujung dan
satu buah pintu keluar di ujung satunya dimana membutuhkan variabel Head
dan Tail ( depan/front, belakang/rear).
a. Konsep Queue
Queue adalah bentuk lain dari konsep implementasi linked list.
Berbeda dengan Stack, yang menerapkan konsep LIFO (Last In First
Out), Queue justru mempunyai konsep yang berbeda yakni FIFO (First In
First Out). Setiap data yang pertama kali masuk, dialah yang akan keluar
duluan. Contoh paling simple dalam kehidupan sehari hari adalah
antrian pengunjung bank. Biasanya saat masuk, kita akan diberi nomor
antrian terlebih dahulu sebelum dipanggil oleh teller. Kita akan menunggu
sampai urutan kita barulah kita dapat bertransaksi di teller.
2. IsEmpty()
Untuk memeriksa apakah Antrian sudah penuh atau belumDengan cara
memeriksa nilai Tail, jika Tail = -1 maka empty
Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala
antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah
Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian
kebelakang, yaitu menggunakan nilai Tail.
3. IsFull
Untuk mengecek apakah Antrian sudah penuh atau belum Dengan cara
mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas
elemen array pada C) berarti sudah penuh
4. Enqueue
Untuk menambahkan elemen ke dalam Antrian, penambahan elemen
selalu ditambahkan di elemen paling belakang Penambahan elemen
selalu menggerakan variabel Tail dengan cara increment counter Tail
terlebih dahulu
5. Dequeue()
Digunakan untuk menghapus elemen terdepan/pertama (head) dari
AntrianDengan cara menggeser semua elemen antrian kedepan dan
mengurangi Tail dgn Penggeseran dilakukan dengan menggunakan
looping.
6. Clear()
Untuk menghapus elemen-elemen Antrian dengan cara mebuat Tail
dan Head = -1 Penghapusan elemen-elemen Antrian sebenarnya tidak
menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya
ke nilai -1 sehingga elemen-elemen Antrian tidak lagi terbaca
7. Tampil()
Untuk menampilkan nilai-nilai elemen Antrian
Menggunakan looping dari head s/d tail
class Queue:
def __init__(self):
self.items=[]
def isEmpty(self):
return self.items == []
def enqueue(self,item):
self.items.insert(0,item)
def dequeue(self):
return self.items.pop()
def rear(self):
return self.items[0]
def front(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
def open(self):
return self.items
def antrian():
endtime = datetime.now() + timedelta(seconds = 2)
tanda='n'
m = Queue()
cad = Queue()
inputan = int(input('Masukan berapa orang yang ingin antri = '))
for i in range(inputan):
nama = input('Masukan nama costumer ke %i = '%(i+1))
m.enqueue(nama)
cad.enqueue(nama)
tanda='n'
print("=======================Antrian======================")
while not cad.isEmpty():
if not cad.isEmpty():
if tanda==0:
print(cad.dequeue(),'sedang dilayani')
tanda=1
else:
sleep(2)
print(cad.dequeue(),'sedang dilayani')
if cad.isEmpty():
print('===============Antrian Kosong==================')
antrian()
antrian()
e. Sumber/referensi
• https://baranghalusdev.blogspot.com/2017/04/queue-pada-python-
indonesian-language.html
• https://www.mahirkoding.com/struktur-data-queue-dan-
implementasinya/
• https://blog-arul.blogspot.com/2012/01/queue-pada-struktur-
data.html
second.push(3)
second.push(7)
print "\nList Kedua yaitu =",
second.printList()," "
res = LinkedList()
res.addTwoLists(first.head, second.head)
print "\nPenjumlahan Kedua List =",
res.printList()
struct node
{
int data;
node* next; // untuk menghubungkan dengan node lain,
tipe data dibuat sama seperi aturan penggunaan pointer.
};
node* head;
node* tail;
node* curr;
node* entry;
node* del;
void inisialisasi()
{
head = NULL;
tail = NULL;
}
void hapus()
{
int simpan;
if(head==NULL)
{
cout<<"\nlinked list kosong, penghapusan tidak
bisadilakukan"<<endl;
}
else
{
simpan = head ->data;
//hapus depan
del = head;
head = head->next;
delete del;
void cetak()
{
curr = head;
if(head == NULL)
cout<<"\ntidak ada data dalam linked
list"<<endl;
else
{
cout<<"\nData yang ada dalam linked list
adalah"<<endl;
cout<<setw(6);
while(curr!=NULL)
{
cout<<curr->data<<"->";
curr = curr->next;
}
cout<<"NULL";
cout<<endl;
}
}
void menu()
{
char pilih, ulang;
int data;
do
{
system("cls");
cout<<"SINGLE LINKED LIST NON CIRCULAR"<<endl;
cout<<"-------------------------------"<<endl;
cout<<"Menu : "<<endl;
cout<<"1. Input data"<<endl;
cout<<"2. Hapus data"<<endl;
cout<<"3. Cetak Data"<<endl;
cout<<"4. Exit"<<endl;
cout<<"Masukkan pilihan Anda : ";
cin>>pilih;
switch(pilih)
{
case '1' :
cout<<"\nMasukkan data : ";
cin>>data;
input(data);
break;
case '2' :
hapus();
break;
case '3' :
cetak();
break;
case '4' :
exit(0);
break;
default :
cout<<"\nPilih ulang"<<endl;
}
cout<<"\nKembali ke menu?(y/n)";
cin>>ulang;
}while(ulang=='y' || ulang=='Y');
}
int main()
{
inisialisasi();
menu();
return EXIT_SUCCESS;
}
Output
Masukkan data : 2
Kembali ke menu?(y/n)
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 1
Masukkan data : 3
Kembali ke menu?(y/n)
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 1
Masukkan data : 4
Kembali ke menu?(y/n)
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 1
Masukkan data : 5
Kembali ke menu?(y/n)
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 1
Masukkan data : 6
Kembali ke menu?(y/n)
Hapus data
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 2
Kembali ke menu?(y/n)
Ceak data
SINGLE LINKED LIST NON CIRCULAR
-------------------------------
Menu :
1. Input data
2. Hapus data
3. Cetak Data
4. Exit
Masukkan pilihan Anda : 3
Kembali ke menu?(y/n)
e. Sumber/Referensi
• https://www.coursehero.com/file/49673220/Operasi-Pada-Single-Linked-
Listdocx/#:~:text=html%20Operasi%20Pada%20Single%20Linked%20List%
201.%20Insert%20%3D%20Istilah%20Insert,linked%20list%20kosong%20at
au%20tidak.
• https://irvandimetrio21.home.blog/2019/07/23/program-penambahan-
list-dengan-linked-list-di-python/
• http://www.nblognlife.com/2014/12/single-linked-list-pada-c.html
4. Pohon biner (binary tree)
Merupakan salat Satu bentuk Struktur Data tidak linier Yang
menggambarkan hubungan Yang bersifat hirarkis (hubungan one to many)
antara elemen-elemen. Tree Bisa didefinisikan sebagai kumpulan Simpul /
node dengan Satu elemen KHUSUS Yang disebut root Dan Node lainnya
terbagi menjadi Himpunan-Himpunan Yang tak saling berhubungan Satu
sama lainnya (disebut subtree).
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items==[]
def push(self,items):
self.items.append(items)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items)-1]
def size(self):
return len(self.items)
class Binarytree:
def __init__(self,root):
self.key = root
self.leftChild = None
self.rightChild = None
def insertLeft(self,newNode):
if self.leftChild == None :
self.leftChild = Binarytree(newNode)
else :
t = Binarytree(newNode)
t.leftChild = self.leftChild
self.leftChild = t
def insertRight(self,newNode):
if self.rightChild == None :
self.rightChild = Binarytree(newNode)
else :
t = Binarytree(newNode)
t.rightChild = self.rightChild
self.rightChild = t
def getrightChild(self):
return self.rightChild
def getleftChild(self):
return self.leftChild
def getrootVal(self):
return self.key
def setrootVal(self,obj):
self.key = obj
def size(self):
count = 0
selfleft = self
selfright = self
while selfleft.getleftChild() != None or selfright.getrightChild() !=
None :
count += 1
if selfleft.getleftChild() != None:
selfleft = selfleft.getleftChild()
else :
selfright = selfright.getrightChild()
return count
def Inorder(root):
if root:
Inorder(root.getleftChild())
print(root.getrootVal(),end=" ")
Inorder(root.getrightChild())
def Preorder(root):
if root:
print(root.getrootVal(),end=" ")
Preorder(root.getleftChild())
Preorder(root.getrightChild())
def Postorder(root):
if root:
Postorder(root.getleftChild())
Postorder(root.getrightChild())
print(root.getrootVal(),end=" ")
root = Binarytree('P')
root.insertLeft('F')
root.getleftChild().insertLeft('B')
root.getleftChild().insertRight('H')
root.getleftChild().getleftChild().insertLeft('A')
root.getleftChild().getrightChild().insertRight('M')
root.insertRight('S')
root.getrightChild().insertLeft("R")
root.getrightChild().insertRight("W")
Inorder(root)
print ()
Preorder(root)
print ()
Postorder(root)
• (Https://Wikipedia.org)
• (https://www.google.com/amp/s/dimasandree.wordpress.com/2013/12/
18/konsep-dasar-stack-dan-binary-tree/amp/)
• (https://www.google.com/amp/s/saragusti22.wordpress.com/2015/05/0
4/pengantar-struktur-data-tree-dan-binary-tree/amp/)
• (Https://academia.edu)
• (http://fitrianisaa25.blogspot.com/2018/06/tree-1.html?m=1)
• https://www.google.com/amp/s/dimasandree.wordpress.com/2013/12/1
8/konsep-dasar-stack-dan-binary-tree/amp/)
• (https://www.academia.edu/9114596/Penerapan_Teknik_Binary_Searc
h_Tree_Sebagai_Alternatif_Penyimpanan_Data)
• https://www.google.com/amp/s/saragusti22.wordpress.com/2015/05/04
/pengantar-struktur-data-tree-dan-binary-tree/amp/)