Un grande classico: l'allineamento parentesi:
{[()]} = ok
((())]= non ok.
Ho scritto un programma che è in grado di capire se l'allineamento è corretto, in più l'ho dotato di una piccola variazione, stampa
se l'allineamento è corretto ma la priorità no:
((([])))= allineamento ok, priorità no.
i passi sono questi:
1) input (se la stringa è dispari, per forza l'allineamento non è corretto)
2) se contiene caratteri non validi--->riscrivi
al posto di passare i caratteri ( [ { ) ] } alla lista adibita a stack, passo t,q,g alle parentesi aperte, mente T,Q,G a quelle chiuse
Questo mi evita un po' di if, se passo partentesi tonda chiusa: )---->T
io devo cercare nella posizione precedente il corrispettivo di lower(T)
Avrei potuto anche usare un dizionario
Codice: Seleziona tutto
x={'t':'(','q':'[','g':'{','T':')','Q':']','G':'{'}
ma mi sembra eccessivo, magari è più elegante, ma forse anche più oneroso...non so.
Per la priorità invece mi baso sul codice ascii:
io metto nello stack 't' ,'q', 'g'
in ordine alfabetico abbiamo g,q,t di conseguenza se sottraiamo dal codice asci abbiamo un numero negativo in presenza
di priorità errata: ([-----> t,q------> 116-113=-3
Ecco il codice, sicuramente sarà un orrore da principiante....pazienza, accetto volentieri consigli:
Codice: Seleziona tutto
def verifica_st(st):
tabella=['(',')','[',']','{','}']
for i in st:
if i not in tabella:
print("caratteri NON consentiti, riscrivi")
return 0
elif len(st)%2!=0:
print ("parentesi dispari, allineamento NON corretto")
return 0
else:
return 1
#---------------------------------------------------
def parentesi(st_list):
stack=[]
flag=0
for i in range (len(st_list)):
if st_list[i]=='[' :stack.append('q')
if flag==0:
if len (stack)>=1 and (ord (stack[len(stack)-1]))-(ord (stack[len(stack)-2]))<0:
print("errore priorità")
flag=1
if st_list[i]=='(' :stack.append('t')
if flag==0:
if len (stack)>=1 and (ord (stack[len(stack)-1]))-(ord (stack[len(stack)-2]))<0:
print("errore priorità")
flag=1
if st_list[i]=='{' :stack.append('g')
if flag==0:
if len (stack)>=1 and (ord (stack[len(stack)-1]))-(ord (stack[len(stack)-2]))<0:
print("errore priorità")
flag=1
#---------------------------------------------------------
if st_list[i]==']' :
stack.append('Q')
if stack[len(stack)-2].lower()=='q':
stack.pop();stack.pop()
if st_list[i]==')' :
stack.append('T')
if stack[len(stack)-2].lower()=='t':
stack.pop();stack.pop()
if st_list[i]=='}' :
stack.append('G')
if stack[len(stack)-2].lower()=='g':
stack.pop();stack.pop()
flag=0
return len(stack)
#---------------------------------------------------
while True:
st=input("inserisci espressione ")
print("espressione da valutare: ",st)
res=verifica_st(st)
if res==1:
st_list=list(st)
x=parentesi(st_list)
if x==0:
print ('allineamento:OK')
else:
print ('allineamento: NON OK',x)