4. Helyes zárójelezés algoritmusa Kaszab Gábor
Az algoritmus célja: Eldönti egy zárójelezésről, hogy helyes-e Kiírja az összetartozó zárójelpárok sorszámait egymás mellé
Helyes zárójelezés A nyitó és csukó zárójelek száma megegyezik A zárójelezés bármely pontjában nagyobb vagy egyenlő a nyitózárójelek száma, mint a csukó zárójeleké
Az algoritmus működése Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Egy verem segítségével dolgozik A verem műveletei: Empty(v) : létrehoz egy üres vermet Push(v,i) : beteszi a verembe az i elemet Pop(v,j) : kiveszi a veremből a legfelső elemet
Az algoritmus működése Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Létrehoz egy üres vermet Az i-ben tároljuk az aktuális zárójel sorszámát, ami kezdéskor 0
Az algoritmus működése Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Indít egy ciklust, addig, amíg a zárójelezést tartalmazó sorozat ki nem ürül A ciklusmag első lépéseként, kiveszi a sorozat első elemét , és beteszi az x változóba Az i számlálót növeli egyel
Az algoritmus működése Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Egy elágazással megvizsgálja, hogy milyen zárójelet olvastunk ki a sorozatból Nyitó zárójel esetén beteszi a sorszámát a verembe Csukó zárójelnél pedig kiveszi a verem legfelső elemét és kiírja a képernyőre az i változó aktuális értékével együtt
Az algoritmus működése Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Ha az algoritmus lefutása után is marad elem a veremben, a zárójelezés helytelen / pl.: ( ( ) / Ha a verem üres és a sorozat következő eleme „)”, a zárójelezés helytelen / pl.: ( ) ) /
Példa Kezdeti értékek: -Az s sorozat: ( ( ) ) -A v verem: üres Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) Kezdeti értékek: -Az s sorozat: ( ( ) ) -A v verem: üres -Az i számláló: 0 Belelép a ciklusba, mert az s nem üres
Példa -Az s sorozat: ( ) ) -A v verem: üres -Az x változó: ( Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ( ) ) -A v verem: üres -Az x változó: ( -Az i változó: 1
Példa -Az s sorozat: ( ) ) -A v verem: 1 -Az x változó: ( Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ( ) ) -A v verem: 1 -Az x változó: ( -Az i változó: 1
Példa -Az s sorozat: ) ) -A v verem: 1 -Az x változó: ( Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ) ) -A v verem: 1 -Az x változó: ( -Az i változó: 2
Példa -Az s sorozat: ) ) -A v verem: 1 2 -Az x változó: ( Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ) ) -A v verem: 1 2 -Az x változó: ( -Az i változó: 2
Példa -Az s sorozat: ) -A v verem: 1 2 -Az x változó: ) Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ) -A v verem: 1 2 -Az x változó: ) -Az i változó: 3
Példa -Az s sorozat: ) -A v verem: 1 -Az x változó: ) -Az i változó: 3 Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: ) -A v verem: 1 -Az x változó: ) -Az i változó: 3 Kivette a verem legfelső elemét. Kiírja: 2-3
Példa -Az s sorozat: üres -A v verem: 1 -Az x változó: ) Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: üres -A v verem: 1 -Az x változó: ) -Az i változó: 4
Példa -Az s sorozat: üres -A v verem: üres -Az x változó: ) Zarojel(s) Empty(v); i:=o s ≠ ε Read(s,x); i:=i+1 x = „(” x = „)” Push(v,i) Pop(v,j) Write(j,i) -Az s sorozat: üres -A v verem: üres -Az x változó: ) -Az i változó: 4 Kiírja: 1-4 Mivel a sorozat kiürült, kilép a ciklusból és véget ér a algoritmus
Vége