Implementación de Estructuras de Datos: Colas con Pilas, Pilas con Colas y Validación de Expresiones

Los problemas 232 y 225 comparten una estrategia fundamental para implementar estructuras de datos mediente otras, lo que permite abordarlos de manera eficiente.


class ColaConPilas {
public:
    void push(int valor) {
        pila_entrada.push(valor);
    }
    
    int pop() {
        while (!pila_entrada.empty()) {
            pila_salida.push(pila_entrada.top());
            pila_entrada.pop();
        }
        int resultado = pila_salida.top();
        pila_salida.pop();
        while (!pila_salida.empty()) {
            pila_entrada.push(pila_salida.top());
            pila_salida.pop();
        }
        return resultado;
    }
    
    int peek() {
        while (!pila_entrada.empty()) {
            pila_salida.push(pila_entrada.top());
            pila_entrada.pop();
        }
        int resultado = pila_salida.top();
        while (!pila_salida.empty()) {
            pila_entrada.push(pila_salida.top());
            pila_salida.pop();
        }
        return resultado;
    }
    
    bool empty() {
        return pila_entrada.empty();
    }
private:
    std::stack<int> pila_entrada;
    std::stack<int> pila_salida;
};

La implementación de pilas mediante colas sigue un enfoque similar, utilizando dos colas para gestionar el comportamiento de LIFO.


class PilaConColas {
public:
    void push(int valor) {
        cola_auxiliar.push(valor);
        while (!cola_principal.empty()) {
            cola_auxiliar.push(cola_principal.front());
            cola_principal.pop();
        }
        std::swap(cola_principal, cola_auxiliar);
    }
    
    int pop() {
        int elemento = cola_principal.front();
        cola_principal.pop();
        return elemento;
    }
    
    int top() {
        return cola_principal.front();
    }
    
    bool empty() {
        return cola_principal.empty();
    }
private:
    std::queue<int> cola_principal;
    std::queue<int> cola_auxiliar;
};

El problema 20 requiere validar expresiones matemáticas mediente el uso de una pila para verificar coincidencias de símbolos.


class ValidadorExpresiones {
public:
    bool isValid(std::string expresion) {
        std::vector<char> pila;
        for (char caracter : expresion) {
            if (caracter == '(' || caracter == '[' || caracter == '{') {
                pila.push_back(caracter);
            } else {
                if (pila.empty()) return false;
                char ultimo = pila.back();
                if ((caracter == ')' && ultimo != '(') ||
                    (caracter == ']' && ultimo != '[') ||
                    (caracter == '}' && ultimo != '{')) {
                    return false;
                }
                pila.pop_back();
            }
        }
        return pila.empty();
    }
};

El problema 1047 se resuelve eficientemente usando una sola pila para eliminar caracteres adyacentes repetidos en una cadena.


class EliminadorDuplicados {
public:
    std::string removeDuplicates(std::string cadena) {
        std::stack<char> pila;
        for (char c : cadena) {
            if (!pila.empty() && pila.top() == c) {
                pila.pop();
            } else {
                pila.push(c);
            }
        }
        std::string resultado;
        while (!pila.empty()) {
            resultado += pila.top();
            pila.pop();
        }
        std::reverse(resultado.begin(), resultado.end());
        return resultado;
    }
};

Etiquetas: C++ stack queue data-structures valid-parentheses

Publicado el 9-12 18:43