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). Desempila6
i2
, calcula6 + 2 = 8
, i empila8
. - Llegeix el cinquè element:
*
(operador). Desempila5
i8
, calcula5 * 8 = 40
, i empila40
. - Llegeix el sisè element:
12
(operand). Empila12
. - Llegeix el setè element:
4
(operand). Empila4
. - Llegeix el vuitè element:
/
(operador). Desempila12
i4
, calcula12 / 4 = 3
, i empila3
. - Llegeix el novè element:
-
(operador). Desempila40
i3
, 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: 120
En 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: False
Conclusió
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