Les piles són una estructura de dades fonamental en la programació i tenen una àmplia gamma d'aplicacions en diversos àmbits. En aquesta secció, explorarem algunes de les aplicacions més comunes de les piles, proporcionant exemples pràctics i explicacions detallades.
- Avaluació d'Expressions
1.1. Expressions Infix, Prefix i Postfix
Les piles són especialment útils per a l'avaluació d'expressions aritmètiques i lògiques. Hi ha tres formes principals d'expressions:
- Infix: L'operador es troba entre els operands (per exemple,
A + B). - Prefix: L'operador precedeix els operands (per exemple,
+ A B). - Postfix: L'operador segueix els operands (per exemple,
A B +).
1.2. Avaluació d'Expressions Postfix
Les expressions postfix són més fàcils d'avaluar amb una pila. Considerem l'expressió postfix 5 6 2 + * 12 4 / -.
Pas a pas:
- Llegeix el primer element:
5(operand). Empila5. - Llegeix el segon element:
6(operand). Empila6. - Llegeix el tercer element:
2(operand). Empila2. - Llegeix el quart element:
+(operador). Desempila6i2, calcula6 + 2 = 8, i empila8. - Llegeix el cinquè element:
*(operador). Desempila5i8, calcula5 * 8 = 40, i empila40. - Llegeix el sisè element:
12(operand). Empila12. - Llegeix el setè element:
4(operand). Empila4. - Llegeix el vuitè element:
/(operador). Desempila12i4, calcula12 / 4 = 3, i empila3. - Llegeix el novè element:
-(operador). Desempila40i3, calcula40 - 3 = 37, i empila37.
El resultat final és 37.
def evaluate_postfix(expression):
stack = []
for char in expression.split():
if char.isdigit():
stack.append(int(char))
else:
b = stack.pop()
a = stack.pop()
if char == '+':
stack.append(a + b)
elif char == '-':
stack.append(a - b)
elif char == '*':
stack.append(a * b)
elif char == '/':
stack.append(a / b)
return stack.pop()
expression = "5 6 2 + * 12 4 / -"
print(evaluate_postfix(expression)) # Output: 37
- Control de la Recursió
Les piles són essencials per implementar la recursió. Quan una funció crida a si mateixa, el sistema operatiu utilitza una pila per mantenir el seguiment de les crides de funció.
2.1. Exemple: Factorial
El càlcul del factorial d'un nombre és un exemple clàssic de recursió.
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # Output: 120En aquest exemple, cada crida a factorial es col·loca a la pila fins que n arriba a 0. Després, les crides es resolen en ordre invers.
- Reversió de Text
Les piles es poden utilitzar per invertir una cadena de text.
3.1. Exemple: Inversió de Cadena
def reverse_string(s):
stack = []
for char in s:
stack.append(char)
reversed_s = ''
while stack:
reversed_s += stack.pop()
return reversed_s
print(reverse_string("Hello, World!")) # Output: !dlroW ,olleH
- Historial de Navegació
Els navegadors web utilitzen piles per gestionar l'historial de navegació. Quan visites una pàgina nova, aquesta es col·loca a la pila. Quan prems el botó de retrocedir, la pàgina actual es treu de la pila i es mostra la pàgina anterior.
4.1. Exemple: Historial de Navegació
class BrowserHistory:
def __init__(self):
self.history = []
self.forward_stack = []
def visit(self, url):
self.history.append(url)
self.forward_stack.clear()
def back(self):
if len(self.history) > 1:
self.forward_stack.append(self.history.pop())
return self.history[-1]
return None
def forward(self):
if self.forward_stack:
self.history.append(self.forward_stack.pop())
return self.history[-1]
return None
# Exemple d'ús
browser = BrowserHistory()
browser.visit("google.com")
browser.visit("stackoverflow.com")
browser.visit("github.com")
print(browser.back()) # Output: stackoverflow.com
print(browser.back()) # Output: google.com
print(browser.forward()) # Output: stackoverflow.com
- Validació de Parèntesis
Les piles es poden utilitzar per validar expressions amb parèntesis, claudàtors o claus.
5.1. Exemple: Validació de Parèntesis
def is_valid_parentheses(expression):
stack = []
matching_parentheses = {')': '(', ']': '[', '}': '{'}
for char in expression:
if char in matching_parentheses.values():
stack.append(char)
elif char in matching_parentheses.keys():
if stack == [] or matching_parentheses[char] != stack.pop():
return False
return stack == []
print(is_valid_parentheses("(([]){})")) # Output: True
print(is_valid_parentheses("(([]){}")) # Output: FalseConclusió
Les piles són una eina poderosa i versàtil en la programació. Hem vist com es poden utilitzar per avaluar expressions, controlar la recursió, invertir text, gestionar l'historial de navegació i validar parèntesis. Aquests exemples només rasquen la superfície de les aplicacions possibles de les piles. Practicar amb aquests exemples i implementar les teves pròpies aplicacions t'ajudarà a comprendre millor aquesta estructura de dades fonamental.
Curs d'Estructures de Dades
Mòdul 1: Introducció a les Estructures de Dades
- Què són les Estructures de Dades?
- Importància de les Estructures de Dades en la Programació
- Tipus d'Estructures de Dades
Mòdul 2: Llistes
- Introducció a les Llistes
- Llistes Enllaçades
- Llistes Doblement Enllaçades
- Llistes Circulars
- Exercicis amb Llistes
Mòdul 3: Piles
- Introducció a les Piles
- Operacions Bàsiques amb Piles
- Implementació de Piles
- Aplicacions de les Piles
- Exercicis amb Piles
Mòdul 4: Cues
- Introducció a les Cues
- Operacions Bàsiques amb Cues
- Cues Circulars
- Cues de Prioritat
- Exercicis amb Cues
Mòdul 5: Arbres
- Introducció als Arbres
- Arbres Binàries
- Arbres Binàries de Cerca
- Arbres AVL
- Arbres B
- Exercicis amb Arbres
Mòdul 6: Grafs
- Introducció als Grafs
- Representació de Grafs
- Algoritmes de Cerca en Grafs
- Algoritmes de Camins Mínims
- Aplicacions dels Grafs
- Exercicis amb Grafs
