Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
rád bych věděl, jak je možno vytisknout výraz (bez vyhodnocení) v infixové notaci z binárního stromu výrazů s minimálními závorkami. Mám vstup v postfixové notaci, který jsem vložil do binárního stromu. Při průchodu stromem inorder s rekurzí umím získat infovou notaci buď bez závorek anebo s úplnými závorkami. Chybí mně implementace minimálních závorek. Vím, že potřebuji sledovat prioritu předchozího operátoru s tím, že napravo mě zajímá i rovnost priorit, zatímco nalevo pouze menší priorita. Program mám v pythonu. Minimální závorky zvládnu v seznamu, ale ne na stromu. Děkuji za pomoc.
Offline
auditor napsal(a):
Vím, že potřebuji sledovat prioritu předchozího operátoru s tím, že napravo mě zajímá i rovnost priorit, zatímco nalevo pouze menší priorita.
Prijde mi, ze reseni znas; v cem je tedy problem?
Offline
↑ Stýv:
Problém je v implementaci. Mám funkci strom, která postaví strom aritmetického výrazu. Pak mám funkci infix, která tiskne výraz pomocí rekurze.
Nevím, jak mám udržovat předchůdce mezi funkcemi. Momentálně se mně nedaří odlišit předchůdce od aktuálního operátoru. Předchůdce mám odkazem z aktuálního operátoru.
Dále nevím, jestli mám umístit podmínky na prioritu operátorů ve funkci infix před příkazy vložení pravé a levé závorky nebo v jiném místě.
Offline
↑ Stýv:
class Vrchol:
def __init__(self , hodnota):
self.hodnota = hodnota
self.levy = None
self.pravy = None
def strom(p):
zasobnik = []
for i in range(len(p)):
if not operator(p[i]):
t = Vrchol(p[i])
zasobnik.append(t)
else:
t = Vrchol(p[i])
t1 = zasobnik.pop()
t2 = zasobnik.pop()
t.pravy = t1
t.levy = t2
zasobnik.append(t)
t = zasobnik.pop()
return t
def infix(t):
if t != None:
if t.levy == None and t.pravy == None:
print(t.hodnota, end='')
else:
print('(', end='')
infix(t.levy)
print(t.hodnota, end='')
infix(t.pravy)
print(')', end='')
def operator(c):
if (c == '+' or c == '-' or c == '*' or c == '/'):
return True
else:
return False
def priorita(g):
if (g == '+'or g == '-'):
return 0
else:
return 1
p = []
p = input().split()
r = strom(p)
infix(r)
Offline
Jo uz vidim, s cim mas problem. Ty delas zavorky kolem prave vyhodnocovaneho vyrazu, takze nepoznas, jestli jsou vlastne potreba. Kdyz misto toho budes delat zavorky kolem tech dvou synu, tak to pujde poznat snadno.
Offline
↑ Stýv:
Přiznám se, že nevím, jak to udělat. Vyzkoušel jsem několik variant funkce infix, ale žádná bohužel nevedla k cíli.
Příklad:
def infix(t):
if t.levy != None:
if (t.levy.levy == None and t.levy.pravy == None):
print(t.levy.hodnota, end='')
elif operator(t.hodnota) < operator(t.levy.hodnota):
print('(', end='')
infix(t.levy.levy)
print(t.levy.hodnota, end='')
infix(t.levy.pravy)
print(')', end='')
else:
infix(t.levy.levy)
print(t.levy.hodnota, end='')
infix(t.levy.pravy)
if t.pravy != None:
if (t.pravy.levy == None and t.pravy.pravy == None):
print(t.pravy.hodnota, end='')
elif operator(t.hodnota) < operator(t.pravy.hodnota) or operator(t.hodnota) == operator(t.pravy.hodnota):
print('(', end='')
infix(t.pravy.levy)
print(t.pravy.hodnota, end='')
infix(t.pravy.pravy)
print(')', end='')
else:
infix(t.pravy.levy)
print(t.pravy.hodnota, end='')
infix(t.pravy.pravy)
Offline
Řídil jsem se doporučením, že mám dělat závorky kolem synů, což chápu jako závorky kolem t.levy.hodnota a t.pravy.hodnota. Prioritu operátorů řeším společně s předchozím bodem v částech elif.
Měl jsem za to, že jsem postoupil pouze o jedno patro níž z t na t.levy / t.pravy, což mně umožnilo rozlišit rozdílné priority operátorů pro levou a pravou stranu.
Offline
Zavorky mas delat kolem infix(t.levy) a infix(t.pravy), tj. stacilo pridat dva radky, kdyz opomineme ty podminky. A pokud jde o ty podminky, tak si je po sobe precti. Funkci priorita jsi vubec nepouzil.
Offline
↑ Stýv:
Děkuji moc. Upravil jsem. Závorky jsem dal kolem infix(t.levy) a infix(t.pravy) a v podmínkách používám funkci priorita. Bohužel stále nefunguje.
def infix(t):
if t != None:
if t.levy == None and t.pravy == None:
print(t.hodnota, end='')
else:
if priorita(t.hodnota) < priorita(t.levy.hodnota):
print('(', end='')
infix(t.levy)
print(')', end='')
else:
infix(t.levy)
print(t.hodnota, end='')
if priorita(t.hodnota) < priorita(t.pravy.hodnota) or priorita(t.hodnota) == priorita(t.pravy.hodnota):
print('(', end='')
infix(t.pravy)
print(')', end='')
else:
infix(t.pravy)
Offline
Stránky: 1