⟨ 3,−2 ⟩ InsertLast(P3,P2), Next(P2)⟨ 2,−1 ⟩ InsertLast(P3,P2), Next(P2)⟨ 1,−2 ⟩ InsertLast(P3,P2), Next(P2)⟨ 0,−10 ⟩ InsertLast(P3,P2), Next(P2)
koefisien jadi minus karena P2 dikurang basically 0-P2 jadi mines (-)
⟨ 3,−2 ⟩ InsertLast(P3,P2), Next(P2)⟨ 2,−1 ⟩ InsertLast(P3,P2), Next(P2)⟨ 1,−2 ⟩ InsertLast(P3,P2), Next(P2)⟨ 0,−10 ⟩ InsertLast(P3,P2), Next(P2)
koefisien jadi minus karena P2 dikurang basically 0-P2 jadi mines (-)
⟨ 3,2 ⟩ InsertLast (P3,P1), Next(P1)⟨ 2,1 ⟩ InsertLast (P3,P1), Next(P1)⟨ 1,2 ⟩ InsertLast (P3,P2), Next(P2)⟨ 0,10 ⟩ InsertLast (P3,P1), Next(P1)
Bergantian sesuai urutan
Next(P1)
P2 ga next karena degree ga sama
InsertLast (P3,P1+P2)
Operasi penjumlahan kalau degree sama
Next(P1), Next(P2)
bergerak ke elemen selanjutnya masing masing (P1 dan P2)
penyisipan
PENYISIPAN SESUAI URUTAN MENURUN
⟨ 2,5 ⟩
menempati posisi pertama karna SELALU TERURUT MENURUN
⟨ −999, 0 ⟩
MARK
polinom kosong menjadi sangat “natural
kita punya list yang beneran kosong, kalo array kan di declare dulu semuanya tapi gaada isinya aje/0
Kalau banyak yang muncul?
Maka gaakan efisien dengan berkait karena tiap degree yang sama jika muncul kembali akan disimpan di tempat terpisah.
populatePol(p1); populatePol(p2)
kenapa P3 gaperlu di populate?
P1 = P'
ini emang jadi array baru (yang berbeda)
9
degree terbesar bisa berubah kalo derajat 9 jadi 0/habis (berubah jadi 8)
berderajat 9
karena derajat paling tinggi
degree
index sekalian derajat pollinom
arrSuku
koefisien polinom
nMax
menyatakan pangkat tertinggi yang dapat disimpan dalam polinom ini
4x5 + 2x4 +7x2 + 10
x^3 sebenernya ada tapi 0, tapi mending ga ditulis biar kalo pangkat nya gede banget ga ribet nulisnya
menghapus elemen dengan prioritas tertinggi (yaitu di Head)
dequeue bakal sama aja intinya
p = newNode(x);if (p != NIL)
SELALU INGET KALO BIKIN NEWNODE BIKIN CASE KALO ALOKASI GAGAL (p == NIL)
List linier “biasa”
list biasa yang cocok, first menunjuk ke elemen pertama list, first nil kalau kosong, first berubah menjadi top dan top menunjuk ke top stack, top bernilai nil kalau stack kosong
precLast
selalu ada di satu elemen di belakang last
while (NEXT(last) != FIRST(*l)) {last = NEXT(last);
mencari first beneran
(NEXT(last) != FIRST(*l)
bukan elemen terakhir
(NEXT(last) != FIRST(*l)
selama last bukan Last beneran (karna di traversal sampe last beneran dari awal/first)
NEXT(p) = p;
hanya satu elemen, next ke diri dia sendiri
(NEXT(pt) != FIRST(l)
LAST
List Sirkuler
Elemen pertamanya dikenali oleh First(L) sedangkan elemen terakhir memiliki next ke elemen pertama (First(L))
NEXT(PREV(LAST(*l))) = NIL;
NEXT ELEMEN SBLM LAST
PREV(NEXT(FIRST(*l))) = NIL;
PREV ELEMEN KEDUA
LAST(*l) = NIL
list kosong
List *l, ElType *x
menghapus elemen dari list L, baru nilai yang di hapus di assign ke X
List dengan tiga elemen
prev dari elemen pertama dan next dari elemen terakhir selalu NIL
List dengan satu elemen
First L dan Last L bernilai sama
NEXT(precLast) = LAST(*l);
kasus biasa
if (precLast == NIL) { /* kasus satu elemen */FIRST(*l) = LAST(*l);
satu-satunya adalah elemen last jadi cuman satu elemen dan dihapus jadi LIST KOSONG.
while (NEXT(last) != LAST(*l)) {precLast = last; last = NEXT(last);}
maju dulu
precLast = NIL
akan selalu mengikuti last, satu langkah di belakang last
p = newNode(x); /* dummy baru */
elemen dummy akan berganti menjadi elemen dummy yang lain
tanpa while loop HARUSNYA LEBIH EFISIEN. Jadi elemen baru akan dicopy ke dummy yang sudah ada dan akan dibuat node baru untuk dummy yang ditunjuk oleh dummy yang menjadi elemen
newNode
alokasi
INFO(p) != x
jadi x itu udah pasti ditemukan, baik ditemukan di elemen (berarti ketemu) atau ketemu di dummy (ga ketemu).
INFO(LAST(l)) = x
x jadi elemen dummy dan berfungsi sebagai sentinel
0
tidak penting angkanya berapapun karena info dummy ga penting
/* Selektor */#define INFO(P) (P)->info#define NEXT(P) (P)->next#define FIRST(L) ((L).first)#define LAST(L) ((L).last)
ini namanya MAKRO selector
typedef struct node* Address;typedef struct node { ElType info; Address next; } Node;
Oke, kita sederhanakan ya! 😊
tNode
):next
itu adalah pointer yang menunjuk ke struct yang sama (struct tNode
).tNode
) untuk ngerti kalau next
menunjuk ke dirinya sendiri.Contoh:
c
typedef struct tNode {
ElType info; // Data di node
Address next; // Pointer ke struct tNode lain
} Node;
Kalau tanpa tag, compiler bingung karena belum selesai baca tipe struct-nya.
buffer
) dan variabel biasa (idxTop
), nggak ada elemen yang menunjuk ke struct Stack
.Contoh:
c
typedef struct {
ElType buffer[CAPACITY]; // Array penyimpan elemen
int idxTop; // Penunjuk elemen teratas
} Stack;
Udah lebih jelas, kan? 😄
Sirkuler Ganda
ist dengan satu eleme
Kalo NIL gaakan punya panah next/prev
Pointer
selain ada pointer next, ada previous untuk nunjuk ke elemen sebelumnya
bisa maju mundur semuanya karena kalo yg biasa ga bisa mundur
tapi ini harus dibayar cukup mahal karena butuh memory yang lebih besar
Sirkuler
kalo ini sbnenrnya kita gapunya FIRST karena list selalu muter.
Keunggulan: Bisa melakukan instruksi secara terus menerus
Elemen terakhir
Next dari elemen terakhir == address dari First(L)
Elemen pertama
Akses elemen pertama cukup First(L)
Elemen terakhir
Elemen terakhir berarti memiliki next address diri dia sendiri
Elemen terakhir ???
Elemen yang menunjuk dummy terakhir
Elemen pertama ????
Elemen yang sebelumnya next dari dummy pertama
Last
lebih berguna ini karna kalo yang naro dummy di akhir doang tetep harus di traversal dari awal sampe akhir (next elemen p == address dummy)
“Dummy Element”
sama kaya tadi cuman ditaruh diakhir.
dummy disini berlaku seperti sentinel. (mark)
Elemen terakhir adalah elemen sebelum dummy (jika next elemen p merupakan address dari dummy)
List dengan dua elemen
Tentu! Berikut penjelasan dengan bahasa simpel dan poin-poin:
first
selalu menunjuk ke dummy element (tidak pernah berubah).insert first
), kita nggak perlu ubah pointer first
. Fokusnya hanya pada elemen setelah dummy.first.next
, bukan di first
.first.next = null
(dummy tetap ada).first
nggak pernah berubah, jadi aman.first
.first
ke elemen baru.first.next
ke elemen baru.first
nggak usah diubah.Dummy element itu intinya biar kode lebih simpel, aman, dan seragam. Udah lebih jelas? 😊
Dummy Element”
DUMMY ELEMENT: bukan elemen sesungguhnya, tidak menyimpan informasi yang akan kita gunakan.
biasanya hanya untuk kajian ilmiah. Elemen pertama bukan yang ditunjuk first, tapi yang ditunjuk NEXT DARI FIRST
muncul karena ketika insert first/last atau at akan berbeda algoritmanya.
kalau insertfirst akan memengaruhi first dan kasus lainnya.
pake dummy element di awal ini, maka first ini gapernah berubah dan selalu nunjuk ke dummy element
List yang Elemen Terakhir Menunjuk pada Diri Sendiri
ini misalkan buat bahasa pemrograman yang ga punya NIL, jadi nodenya nunjuk ke diri sendiri (kalo di akhir)
Biasanya hanya untuk kajian ilmiah saja
Elemen pertama ???Elemen terakhir ???List kosong ???
biasanya macam-macam list linier itu faktor pembedanya ada di 3 faktor ini
lustrasi: pemakaian memori list
Kondisi awal, FirstAvail menunjuk ke nol. FirstList = NIL
Saat InsertFirst: FirstList nunjuk ke 0 dan nextnya NIL FirstAvail nunjuk ke 1 (nunjuk ke elemen yg available berikutnya)
InsertFirst lagi FirstList pindah ke 1, next nunjuk ke 0 FirstAvail nunjuk ke elemen yang kedua.
DeleteLast Node yang terakhir dimasukkan dikembalikan ke FirstAvail (iya emg jadi kaya stack) FirstList menjadi 1
p merupakan Address, tidak bisa di-passke isEmpty yang menerima sebuah List
IS EMPTY CUMAN BISA UNTUK LIST BUKAN ADDRESS
PROBLEMS:l tidak memiliki info.l tidak memiliki next.
pada dasarnya L gapunya info dan next, cuman FIRST
PrintList(l↑.next)
rekureens
Basis 0
tidak melakukan proses rekursif lagi,
List tidak kosong terdiri atas sebuah elemen yang diikuti list
basically kaya rekursif
p ← newNode(val)
kalo mau insert di linkedlist SELALU PAKE NEWNODE karena itu udah auto alokasi dan assign val ke address baru
Pencarian elemen yang memenuhi kondisi
dengan menggunakan satu kondisi tertentu yang dinyatakan oleh predikat P
hile (p↑.next ≠ NIL) and (p↑.info ≠ x) do
TANPA BOOLEAN: tidak ada boolean dalam while loop
kondisi setelah keluar dari loop: apakah P^.Next = Nil (sampe ujung) ata P^.info = X (Ditemukan)
if p = NIL then { List kosong }found ← false
ada handling list kosong
found: boolean
DENGAN BOOLEAN, kalau not found -> P = NIL
iterateproses(p)stop (p↑.next = NIL)
perbedaan dengan skema 2, disini P saat keluar dari loop ini akan menunjuk ke elemen terakhir.
di skema 2: P saat keluar loop akan bernilai NIL.
epeatproses(p)p ← p↑.nextuntil (p = NIL)
REPEAT UNTIL, karena jika sudah sampai titik ini list sudah pasti TIDAK KOSONG, sudah di handle di atas
penanganan list kosong
bedanya di awal ada PERLAKUAN KHUSUS UNTUK LIST KOSONG
InitMemK
peak
GarbageCollection
pengelompokkan yang isi dan kosong
AlokBlok
tadikan ini mem bikin semua blok <1,25> sekarang alokasi emg butuhnya berapa
Zone Bebas:
list zona yang kosong
Degree setiap suku harus disimpan secara eksplisit
gabisa cuman ngandelin indexnya
x1000
kenapa perlu representasi berkait karna kalo x^1000, harus bikin array sepanjang itu jadi agar lebih efisien
populatePol
buat input
CreatePolinom
bikin polinom isinya 0 semua
polinom kosong
polinom sukunya kosong,
misal x^5 dijumlahkan dengan -x^5 jadi polinom kosong
⟨ 0,10 ⟩, ⟨ 4,−9 ⟩, ⟨ 5,5 ⟩, ⟨ 8,9 ⟩, ⟨ 2,1 ⟩, ⟨ 3,2 ⟩, ⟨ 9,4 ⟩, ⟨ 7,4 ⟩,⟨ −999,0 ⟩
BOLEH GA NGURUT
⟨ −999, 0 ⟩
sampai MARK
KONTIGU
array
(1) ⟨ −999, 0 ⟩
ini adalah MARK
degree: integer, coefficient: integer
pasangan harga
P(x)
lebih enak di tulis kebalik biar pemrosesannya lebih mudah
Polinom
bisa pake array dan list berkait
ini kontigu (berarti array)
List linier “biasa” ~ priority queue
karna tail gaada gunanya mending pake list linear biasa (next) kalo mau hapus elemen ga masalah selalu dari depan dan insert pun bakal search dulu dari depan sampe posisi yang tepat untuk elemen tersebut
List Linier yang dicatat first dan last ≍ queue “biasa
untuk insert element (enqueue), harus insert sesuai prioritas, kalau mulai dari tail gapunya pointer ke depan, jadi selalu mulai dari depan dan melihat posisi yang pas dimana.
List Linier yang dicatat first dan last
first jadi head dan last jadi tail. head mencatat elemen pertama dari queue last mencatat elemen terakhir dari queue
DDR_TOP(*s) = NEXT(ADDR_TOP(*s
menunjuk ke elemen ke 2 (next dari p)
(p != NIL
node gagal dibuat karna bernilai nil (karna memori penuh)
node* Address;
untuk mengisi address dari struct node
CF
overflow pada unsigned
CF
flag untuk bilangan unsigned. kalo operasi ada carrynya, misal : 14+3 = 17 tp pada 4 bit jadi 1 dan ada carry 1.
kalo ini terjadi, carry flag nyala (overflow pada bilangan unsigned)
signed
jika operasi hasilnya negatif, maka sign flag (SF) akan diset
overflow ini kaya kalo penjumlahan 4 bit 6+4 = 10 kan harusnya tp karna 4 bit jadi -6, nah ini ga sesuai sama "keinginan manusia" lah jadi ini overflow dan OF akan di set
OF se
OF di set ketka terjadi overflow
1xxxxxxxxxxxx
ciri2 bilangan negatif MSB nya 1
Lossless Decomposition
asumsi gw adalah kalo lossless ini emg ada kondisi khusus (liat next) berarti ga semua data itu lossless, kalo emg udh lossy dari awal gabisa di ubah jadi lossless.
holds on
udah pakem ini fix bgt
satisfies
kebetulan (ga applied globally), karna asumsi juga bisa
B → C
F
A → B
F
A → C
F^+
A functional dependency is a generalization of the notion of a key
emg FD ini generalisasi dari konsep key jadi emg mirip, menghubungkan suatu atribut unik untuk identifikasi atribut lain
Lossless Decomposition
jika tidak ada informasi yang hilang.
cara memenuhi lossless adalah jika setelah dipecah dan digabgung lg dengan natural join akan sama hasilnya dengan relasi awal
ini emg masih perkenalan apa itu lossy dan lossless
Decomposition
untuk mengatasi repetisi, dekomposisi jadi 2 skema. ex jadi instructor dan department.
masalahnya kalo ada kasus misal nama nya sama, jadi ada kelebihan informasi
A Combined SchemaWithout Repetition
misal dibuat tabel nih. kenapa bakal beda sama yang sblumnya? karna akan dilakukan dekomposisi
here is repetition of information
masalah dari hasil join ini ada repetisi misal di yang kerja di physics ada Einstein dan Gold,
informasi building dan budgetnya jadi berulang
last = FIRST(*l);while (NEXT(last) != LAST(*l)) {
naro elemen di sebelum dummy
Alamat elemen dummy tidak berubah
berarti dummy akan selalu di akhir
List gagal terbentuk
gagal terbentuk kalo memorinya habis
sentinel
sentinel ini kaya MARK
Ganda
lebih fleksibel yang ini karena ada LAST JUGA sblm nya cmn first jadi cuman bisa mulai dari kiri
kalo ini bisa dari kanan juga
List dengan Dummy Element di Akhirdan Pencatatan Alamat Elemen Akhir
ini lebih praktis dari dummy last yang gapake "LAST" karena kalo yg sblmnya tetep harus looping dari awal
List Linier yang dicatat alamat elemen pertama dan terakhir
BISA SAMA KAYA SBELUMNYA ATAU NGEBANDINGIN NEXT DI TERAKHIR SAMA DENGAN ADDRESS DI LAST ATAU NGGAK
List Linier
kalo ini node terakhir ditandain nextnya NIL
Last
variasi dari list biasa, ada last jadi bisa implementasi queue pake ini
Euler path:
dilihat edge nya
Hamilton path
dilihat titiknya tepat sekali
erhubung lemah
ga semua terhuubung, b->d gaada
Terhubung kuat
semua bakal terhubung
sederhana
simple circuit kalo ga lewat ke garis yang sama lebih dari sekali
path
path jalur, kalo balik ke titik awal circuit
isomorfis
karena sama persis
diliat derajatnya (sama) misal b sama kaya x d kaya z
Solusi
diagonal pasti 0
bipartite
graph bisa dibagi 2, titik atas dan bawah tidak terhubung secara lgsg
Kubus-n (n-cube)
perbedaan antara gambar 1,2,3 (garis,kotak,kubus) tiap titik beda sat 0->1 10->11
Wheel
ada titik tengahnya
Cycle
minimal titik nya 3
complete graph
SETIAP TITIK TERHUBUNG SATU SAMA LAIN
Degree
kalo directed ada dua, deg+ (berarti keluar) deg- (berarti masuk)
GAADA DI SLIDE
Adjacent
adjacent berdekatan azza
Derajat
ada brpa garis ke titik tsb
incident
garis menyentuh suatu titik
Simple directed graph
karena searah jadi masih simple
gelang
berbentuk gelang,mis V2 kembali ke V2 secara melingkar
Graph
kumpulan titik garis
insertFirst
pake newnode karena build from groundzero
algoritma ini berlaku untuk list kosong attau tidak kosong, why? pikirin ae
0..length(l)
harusnya 0..(length(l)-1)
getElmt, setElmt
bedakan set dan insert kalo get/set node sudah ada kalo insert from ground zero
indexOf
index disini lebih "posisi ke berapa" bukan index spt di array karena ya linked list kan info sama next, sbnrnya gaaada index tapi dibuat2 aja
indexOf
sbnrnya di linked list gaada index. tp kalo kita "buat" index virtual bisa memudahkan kita
Alternative ER NotationsChen, IDE1FX, ...©2024 - Tim Pengajar IF2040 Pemodelan Basis Data23
TRIVIAL, GAMUNGKIN ADA DIUAS HARUSNYA YG BIASA
Binary Vs. Non-Binary Relationships
Binary vs. Non-Binary Relationships:
Binary Relationships: Melibatkan dua entities. Beberapa hubungan non-binary dapat dipecah menjadi beberapa binary relationships untuk menangani kasus tertentu. Misalnya, hubungan ternary parents dapat dipecah menjadi father dan mother untuk memungkinkan informasi parsial. Non-Binary Relationships: Melibatkan lebih dari dua entities (n-ary, untuk n > 2) dan digunakan saat hubungan lebih jelas jika beberapa entities berpartisipasi bersama dalam satu hubungan. Contoh: proj_guide.
Aggregation
aggregasi disini beda dengan di aljabar relasional dan sql.
jadinya, instructor ini kalo ga pake aggregasi bakal terhubung ke semua relasi di atas, biar ga terlalu banyak panah, dibuat kotak besar satu relasi DAN entity ini di hubungkan ke kotaknya aja. contoh bener di slide bwah
condition-defined
berdasarkan kondisi
ook jadi bedanya coondition defined dan user defined, kalo di sql condition defined itu udah di auto assign relasi2nya kalo user defined harus diinput satu2
type=“employee
ini condition defined karna ada type lalaili, yg gaada user defined
partial
Entity tidak wajib menjadi anggota salah satu lower-level entity sets.
total
Entity harus menjadi anggota salah satu lower-level entity sets.
Completeness constraint:specifies whether or not anentity in the higher-level entityset must belong to at leastone of the lower-level entitysets within a generalization
Completeness constraint menentukan apakah sebuah entity di higher-level entity set harus menjadi anggota dari salah satu lower-level entity sets.
Overlapping
bisa lebih dari satu anggota lowe level entity set
Disjoint
hanya bisa menjadi anggota satu lower level entity set
onstraint on whether or notentities may belong to morethan one lower-level entity setwithin a single generalizatio
Menentukan apakah entities bisa termasuk dalam lebih dari satu lower-level entity set.
ser-define
ditentukan pengguna
Constraint on which entities canbe members of a given lower-level entity se
Kendala dalam menentukan apakah entity dapat menjadi anggota lower level entity set (Membership constraint)
Generalization
mulainya dari bawah, misal ada attribut permanent pengen dibuat higher levelnya employee
Generalization adalah proses desain bottom-up, di mana kita menggabungkan beberapa entitas dengan fitur yang sama ke dalam entitas tingkat lebih tinggi. Specialization dan generalization adalah kebalikan satu sama lain dan digambarkan dengan simbol yang sama dalam diagram E-R. Hubungan ISA menunjukkan pewarisan dari superclass ke subclass. Contoh: "Employee" dapat memiliki subclass seperti "Permanent" dan "Temporary," serta "Officer," "Teller," atau "Secretary."
jjadi dia mulainya dari sub class dulu instead of higher levelnya?
Betul! Generalization dimulai dari subclass (entitas tingkat lebih rendah) dan menggabungkannya menjadi superclass (entitas tingkat lebih tinggi). Jadi, kita mengidentifikasi fitur yang sama di beberapa subclass dan menyatukannya ke dalam satu entitas umum yang disebut superclass.
Specialization
Specialization adalah proses desain top-down di mana kita membagi entitas menjadi subkelompok yang memiliki karakteristik unik. Subkelompok ini menjadi entitas tingkat lebih rendah yang mewarisi semua atribut dari entitas tingkat lebih tinggi, tetapi memiliki atribut atau hubungan tambahan yang khusus. Proses ini digambarkan dengan simbol segitiga bertuliskan "ISA", yang menunjukkan hubungan pewarisan. Contohnya, "Customer" adalah subkelompok dari "Person."
The ISA relationship alsoreferred to as superclass-subclass relationship
nama lain is a
Attribute inheritance – a lower-level entity set inherits all theattributes and relationshipparticipation of the higher-levelentity set to which it is linked
atribut yang berada di "lower level" mewarisi atribut yang ada di atasnya. Misal employee mewarisi person (jadi ada 1 + 3 atribut)
wedesignate subgroupings within anentity set that are distinctivefrom other entities in the set.
dibagi menjadi subgroup pakai ISA, jadi person dibagi jadi employee dan customer
List tidak kosong
udh pasti gk kosong
Dasar (tanpa perlakuan khusus untuk List kosong)
menghitung banyak elemen. kan bakal pake cnt, karna kalo list kosong ya cnt ttp 0
contoh lain, mencari elemen terbesar yang mana. ga bisa pake traversal, karena kalo kosong ya gaada yang terbesar, gaberlaku pada list kosong. jadi kasus kedua, ada perlakukan khusus kalo kosong
contoh lain, kasus rata-rata, pembagi gaboleh nol
enis traversa
how to determine kapan kita pake jenis traversal? simply ya emang di coba aja, kalo misal pake dasar ga works try the other way
Skema dasar pemrosesan List berkait• Traversal• Pencarian sekuensial (search)
harus paham kapan kita pake traversal atau search
l: List
sama aja kaya di awal tapi ada tambahan l: List
penghapusan elemen
jadi ngubah reference nunjuk dari elemen ke yang pengen di hapus jadi di skipp.
bisa 2 kasus, hapus dan ga dipake lagi di "free" kalo di hapus dan di pake lagi berarti ga di "free"
"free" ini ngehapus memory yak
penambahan elemen
jadi ya ganti aja update alamatnya bukan nyisipin satu satu
List diacu melalui Address elemen pertamanya (first)
oke tiap node akan ada reference lanjut ke node mana? kalo node pertama gmn?
jadi harus buat kotak node baru lagi bernama First untuk mencatat alamat dari node pertama
node* Address
kalo di notal "pointer to node"
ok intinya ini pake tag node biar bisa memberi instruksi ke preprocessor membuat struct baru node dengan Address yang beda-beda.
pada umumnya itu typedef Node (cara aksesnya)
cuman karna ini pake tag, instead of mengubah, kita membuat baru dengan address yang bisa beda beda
ini typedef struct node* Address (perhatikan bahwa struct di tulis juga)
node
ini tag
tag dan type nya dibedakan (node dan Node) untuk mengatasi strictnya bahasa C dimana tipe tidak bisa di declare setelah operasi lain. dibuatlah jadi tag, im not to sure so ask again ke GPT
Node
type
p1↑
maksud p1 panah ke atas adalah benda yang ditunjuk p1 jadi p2 (5)
sudah dialokasikan 100 elemen makamenggunakan memori sebesar ukuran elemen ×100 meskipun pada suatu waktuhanya 3 elemen yang efektif
jadi node lebih efisien
node ×3.
note terdiri atas info (isi elemen) dan dan next (untuk menunjuk ke elemen selanjutnya)
Node: “next” mencatat alamat elemen berikutnya
Node ini berbeda dengan array, kalo array yaudah per memory isi elemen. Kalo node bisa butuh 2 memory, 1 untuk elemen dan 1 untuk "menunjuk" ke elemen node selanjutnya
elect '437' as FOO
mysql> SELECT '437' AS FOO;
+-----+
| FOO |
+-----+
| 437 |
+-----+
1 row in set (0.00 sec)
menghasilkan konstan dan dinamakan FOO
=A ́B/C
ini namanya stack of float.
sebenernya bisa ttp stack of token, tapi ribet, sebelum dioperasikan harus diconvert terus setlah operasi di convert jadi token lagi
tambahan, harusnya kalo angka gaakan ada negatif
val ← top(s)s.idxTop ← s.idxTop - 1
kebetulan bahwa kita mendefinisikan idxUndefnya -1 jadi auto, kalo pop 0 jadi -1 dan ya udah gausah ada handling khusus
statik
bisa dinamis, tapi type stack ada tambahan capacity, jadi kalo dah cukup ya realloc
Pemakaian Stack• Pemanggilan prosedur• Perhitungan ekspresi aritmatika• Rekursivitas• Backtracking
Function Calls: Like stacking ingredients when cooking – the last added ingredient is used first.
Recursion: Climbing a mountain – you reach the top and then come back down through the same checkpoints in reverse.
Arithmetic Calculations: Old calculators – they solve operations in the order they were entered, using the last numbers first.
Backtracking: Navigating a maze – if you hit a dead end, you backtrack to the previous path until you find the way out.
https://en.wikipedia.org/wiki/File:Tower_of_Hanoi_4.gif
15 langkah mas
LIFO (Last In First Out)
elemen yang terakhir dimasukkan ke dalam stack akan menjadi yang pertama dihapus, seperti ketika menumpuk buku, buku terakhir yang ditaruh di atas akan menjadi yang pertama diambil.
TOP
penghapusan dan penambahan juga dilakukan dari paling atas
TOP
kebalikan queue, penambahan jadinya diatas dan menjadi TOP baru
Ambil
hapus
suksesor dari IdxMaxadalah 0 sehingga idxTail yang baru adalah 0
setelah sama, idx tail jadi 0
algoritma penambahanelemen sama dengan alt-1 dan alt-2.
geser satu ke kanan
3
seolah olah elemen akhir dan awal berdekatan,
jadi head tail bisa berputar mengelilingi array
Harus dilakukan aksi menggeser elemen untuk menciptakan ruangan kosong
harus geser.
pergeseran hanya dilakukan ketika TAIL == IdxMax dan hanya saat ingin tambah elemen lagi
semu
penuh setelah penghapusan, ada array yang kosong akibat penghapusan.
ada elemen koosong sebelum head dan tidak setelah tail
HEAD bergeser ke kanan
geser index head doang
tidak efisien.
karena ada pergeseran elemen
geser semua elemen mulai dari idxHead+1 s.d.idxTail, kemudian geser TAIL ke kiri.
trus yaudah geser sebelah kanan head ke kiri
ambil nilai elemen HEAD
step 1, ambil HAPUS elemen dari head
Kasus khusus (Queue kosong): idxHead dan idxTaildiset = 0
kalo inisialnya queue kosong, asalanya undefined jadi 0 indexnya
Jika masih ada tempat: geser TAIL ke kanan
tail digeser ke kenan (di 5) jadi elemen baru punya index 5