Python - Función para balancear parentesis

 
Vista:

Función para balancear parentesis

Publicado por Nicolás (1 intervención) el 21/10/2022 23:54:03
Hola!

Necesito ayuda para generar un código que devuelva True si las expresiones tienen los parentesis balanceados y False si no lo están.
Para expresiones que contengan otros caracteres ademas de parentesis.
Vengo viendo tutoriales e intentan distintos cambios pero no me doy cuenta en qué esta fallando. A continuación pego el código que generé. Con ciertas expresiones funciona bien pero con otras no por ejemplo:

Con el siguiente input:
(x+y)*(x-z)-9

Devuelve:
False

Con el siguiente input si funciona:
(x-8*(2*5+(2)

Devuelve:
False

Desde ya agradezco cualquier sugerencia para orientarme.



class Stack:
def __init__(self):
self.items = []

def is_empty(self):
return self.items == []

def push(self, item):
self.items.insert(0, item)

def pop(self):
return self.items.pop(0)

def print_stack(self):
print(self.items)



def balanced(expression):
s = Stack()
balanced = True
index = 0

while index < len(expression) and balanced:
paren = expression[index]
if paren in "(":
s.push(paren)
else:
if s.is_empty():
balanced = False
else:
if paren in ")":
s.pop()


index += 1

if s.is_empty() and balanced:
return True
else:
return False




print(balanced(input()))
1
 
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Función para balancear parentesis

Publicado por antonio (65 intervenciones) el 22/10/2022 10:34:36
Hola buenas no hace falta hacer tanto código la solución es más fácil simplemente es recorrer la función insertada que será un string y si hay un ( sumar uno a una variable y si hay ) restar uno a esa variable, otra condición será que el signo de comienzo no sea ) para eso sumaremos uno a esa variable, si al final esa variable es 0 esta balanceada la función(devuelve true) si no, no estará balanceada la función(devuelve false). Este seria un ejemplo seguro que puede haber uno mas sencillo y con menos código, pero es fácil de entender:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
expresion = input("Introduce expresion: ")
numero =0
balanceado=True
for letra in expresion:
    if letra=="(":
        numero=numero+1
    elif letra==")":
        if numero==0:
            balanceado=False
            numero=numero+1
        else:
            numero=numero-1
if numero==0:
    balanceado=True
    print(balanceado)
else:
    balanceado=False
    print(balanceado)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Función para balancear parentesis

Publicado por tincopasan (1082 intervenciones) el 24/10/2022 03:39:49
1)¿necesitas un código o una función?

2)Algo simple:
1
2
3
#-*- coding:utf-8 -*-
def balance(cadena):
    return cadena.count("(") == cadena.count(")")
3)ejemplos de uso:
1
2
3
4
5
print(balance("(x+y)*(x-z)-9"))
print(balance("(x-8*(2*5+(2)"))
 
cadena = input("Ingrese la expresión a evaluar: ")
print(balance(cadena))
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 121
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Función para balancear parentesis

Publicado por Antoni Masana (67 intervenciones) el 24/10/2022 11:54:37
El código de tincopasan peca de optimismo y no es correcto.

1
print( balance( ")x+y(*)x-z(-9" )  )

Este código lo da por bueno y es erróneo.

La solución de antonio la simplificaría así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
expresion = input("Introduce expresion: ")
numero =0
balanceado=True
for letra in expresion:
    if letra=="(":
        numero=numero+1
    elif letra==")":
        numero=numero-1
        if numero<0:
            balanceado=False
 
if balanceado==True:
    print("Balanceo correcto.")
else:
    print("Error en el balanceo de paréntesis.")

Explicación: El paréntesis '(' siempre suma, el paréntesis ')' siempre resta y el resultado siempre tiene que ser cero o mayo de cero, en el momento que sale un negativo hay un error.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 2.808
Oro
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Función para balancear parentesis

Publicado por tincopasan (1082 intervenciones) el 24/10/2022 20:49:15
partamos de la base que dijo balance, la misma cantidad de ambos, no corrección en la estructura de la fórmula, son dos cosas distintas. Es funcional para el planteo te guste o no. Sino tú código ¿no es un error?
expresión =()()()*2

lo cual no es una forma correcta ¿o si?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Antoni Masana
Val: 121
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Función para balancear parentesis

Publicado por Antoni Masana (67 intervenciones) el 25/10/2022 13:55:27
tincopasan me disculpo por el comentario, tienes razón.

Saludos.
\\//_
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar