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
 
