V izrazu bi radi preverili, če so oklepaji / (, ) / postavljeni pravilno
- (a + b)(c + (d – a))
- (a + b))w)(c + (d – a))
- (a + b)(w c + d – a))
Ideja
- +1 ko naletimo na predklepaj
- - 1 ko naletimo na zaklepaj
Kdaj bo ok?
- Na koncu 0
- Ves čas + ali 0
Pravilnost oklepajev – enostavni primer
V izrazu bi radi preverili, če so oklepaji / (, ) / postavljeni pravilno
Ideja
Kdaj bo ok?
Pravilnost oklepajev – več različnih
Kaj pa, če je več parov različnih oklepajev:
Pozor na pravilno gnezdenje!
Pravilnost oklepajev – ideja
Vedno mora zaklepaj dobiti “najbolj sveži” predklepaj
Ko naletimo na zaklepaj, mora biti na vrhu sklada ustrezen predklepaj
Pravilnost oklepajev - algoritem
Za vse znake v izrazu
Če je znak zaklepaj
Če je sklad prazen:
Če je na vrhu napačen predklepaj:
Če je sklad prazen
Algoritem
algoritem SoPravilno(izraz){
# ali so v nizu izraz oklepaji postavljeni pravilno
hrani = new Sklad()
for znak in izraz # pregledamo vse znake
if znak je predklepaj :
hrani.Vstavi(znak) # predklepaj bo počakal na svoj zaklepaj
else :
if znak je zaklepaj :
if hrani.Prazen() :
return false # nihče ne čaka na ubogi zaklepaj
if hrani.Vrh() ne ustreza zaklepaju, ki je v znak :
return false # napačno gnezdenje!
# zaklepaj je dobil ustrezni par na skladu
hrani.Odstrani()
# ostali znaki nas ne zanimajo
# ce ni cakajocih zaklepajev je OK, drugace pa ne
return hrani.Prazen()
Še malo drugačen zapis
public static bool soPravilno(string izraz){
// ali so v izrazu oklepaji postavljeni pravilno
Sklad<char> hrani = new Sklad<char>();
for (int i = 0; i < izraz.Length; i++) {
znak = izraz[i];
if znak je predklepaj
hrani.Vstavi(znak); // predklepaj bo počakal na svoj zaklepaj
else {
if znak je zaklepaj
if hrani.Prazen() return false; // nihče ne čaka na ubogi zaklepaj
if hrani.Vrh() ni ustreza zaklepaju, ki je v znak
return false; // napačno gnezdenje!
// zaklepaj je dobil ustrezni par na skladu
hrani.Odstrani();
// ostali znaki nas ne zanimajo
}
}
// ce ni cakajocih zaklepajev je OK, drugace pa ne
return hrani.Prazen();
}
Spremljanje
Oglejmo si, kaj se dogaja s skladom, če podamo izraz
Matrično množenje
Zmnožimo jo lahko z matriko B dimenzije
Za to potrebujemo
Matriko velikosti a b lahko zmnožimo samo z matriko velikosti b c
Primer:
Kako izračunati A B C D (rezultat bo enak, a načini, kako priti do njega so (vsaj) trije!)
(A B) (C D)
A ((B C) D)
(A (B C)) D
Za izračun optimalnega načina množenja