惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
有赞技术团队
有赞技术团队
博客园 - 三生石上(FineUI控件)
博客园_首页
博客园 - 【当耐特】
WordPress大学
WordPress大学
月光博客
月光博客
博客园 - 叶小钗
S
SegmentFault 最新的问题
雷峰网
雷峰网
H
Help Net Security
宝玉的分享
宝玉的分享
A
About on SuperTechFans
IT之家
IT之家
J
Java Code Geeks
Hugging Face - Blog
Hugging Face - Blog
D
DataBreaches.Net
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
B
Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator Blog

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Stacks en entrevistas técnicas: 3 problemas resueltos pas...
Axel Espinos · 2026-05-28 · via DEV Community

Cuando empecé a resolver problemas de LeetCode cada uno se sentía como un mundo nuevo. Me costó un rato darme cuenta de que la mayoría se agrupan por estructura, y que si reconoces el patrón el problema se desarma solo. Hoy le toca a los stacks.

En el artículo anterior vimos cómo funcionan los stacks por debajo. Hoy usamos esa base para resolver tres problemas clásicos.

Tres problemas distintos (balanced parentheses, reverse string, simplify path) convergiendo en un mismo stack que los resuelve

Lo que vas a encontrar:

  • Tres problemas resueltos paso a paso: balanced parentheses, reverse string y simplify path
  • Dónde aparecen los stacks fuera de las entrevistas

Recordatorio rápido

LIFO: el último que entra es el primero que sale. push agrega al tope, pop saca del tope. En JavaScript un array ya funciona como stack. Si necesitas el detalle completo, está en el artículo anterior.

Vamos a los problemas.

Problema 1: Balanced Parentheses

"Valid Parentheses" de LeetCode.

Problema: dado un string s con solo ()[]{}, determina si es válido. Cada apertura debe tener su cierre correspondiente y en el orden correcto.

Ejemplos
Input:  "()[]{}"   → true
Input:  "([)]"     → false
Input:  "{[]}"     → true

Enter fullscreen mode Exit fullscreen mode

¿Cómo lo pensamos?

"El último que abrió es el primero que debe cerrarse." Justo eso es lo que un stack hace bien.

Recorremos el string. Cada apertura va al stack. Cada cierre debe coincidir con el tope. Si al final el stack queda vacío, todo cerró bien.

Paso a paso del stack validando balanced parentheses

Solución

function validParentheses(s) {
  const stack = [];
  const pairs = { ")": "(", "}": "{", "]": "[" };

  for (const char of s) {
    if (char === "(" || char === "{" || char === "[") {
      stack.push(char);
    } else if (stack.pop() !== pairs[char]) {
      return false;
    }
  }

  return stack.length === 0;
}

Enter fullscreen mode Exit fullscreen mode

Lo importante:

  1. pairs mapea cada cierre con su apertura.
  2. Aperturas van al stack. Cierres hacen pop y validan.
  3. Si el stack está vacío al hacer pop, devuelve undefined y la comparación falla. Cómodo, así no necesitamos un chequeo extra.
  4. Al final, el stack debe estar vacío.

Complejidad: O(n) tiempo y O(n) espacio.

Problema 2: Reverse String (easy)

Adaptación de "Reverse String" de LeetCode. Vamos a invertir una palabra usando stack.

Problema: dado un string s, devuelve el string invertido.

Ejemplos
Input:  "stack"   → "kcats"
Input:  "hello"   → "olleh"

Enter fullscreen mode Exit fullscreen mode

¿Cómo lo pensamos?

"Invertir" es la pista. Metes los elementos en orden y los sacas en orden inverso. Eso es exactamente lo que hace un stack.

En la vida real usarías s.split("").reverse().join("") y listo. Aquí lo hacemos con stack para ver el patrón en acción.

Paso a paso del stack invirtiendo la palabra stack

Solución

var reverseString = function (s) {
  const stack = [...s]; // crea un stack con los caracteres
  let reversed = "";

  while (stack.length > 0) {
    reversed += stack.pop();
  }

  return reversed;
};

Enter fullscreen mode Exit fullscreen mode

Metemos todos los caracteres al stack y los vamos sacando uno por uno. Como pop devuelve el último que entró, los caracteres salen al revés.

Complejidad: O(n) tiempo y O(n) espacio.

Problema 3: Simplify Path (medium)

"Simplify Path" de LeetCode.

Problema: dada una ruta absoluta de Unix, conviértela a su forma canónica.

Reglas:

  • . es el directorio actual.
  • .. sube un nivel.
  • // se trata como /.
  • El resultado no termina en /, salvo la raíz.
Ejemplos
Input:  "/home//foo/"       → "/home/foo"
Input:  "/../"              → "/"
Input:  "/a/./b/../../c/"   → "/c"

Enter fullscreen mode Exit fullscreen mode

¿Cómo lo pensamos?

¿Qué hace ..? Nos regresa al directorio anterior. Ahí está la señal, necesitamos recordar por dónde pasamos y poder retroceder.

Partimos la ruta por / y recorremos cada componente:

  • "" o ".", ignora.
  • "..", saca el tope del stack.
  • Cualquier otra cosa es un directorio y va al stack.

Al final, el stack contiene los directorios de la ruta simplificada.

Paso a paso del stack simplificando una ruta de Unix

Solución

var simplifyPath = function (path) {
  const stack = [];

  for (const part of path.split("/")) {
    if (part === "" || part === ".") continue;
    if (part === "..") stack.pop();
    else stack.push(part);
  }

  return "/" + stack.join("/");
};

Enter fullscreen mode Exit fullscreen mode

Tip: en JavaScript, pop sobre un stack vacío no rompe nada, solo devuelve undefined. Así que si la ruta intenta subir más allá de la raíz, no hace falta validación extra.

Complejidad: O(n) tiempo y O(n) espacio.

El patrón detrás de los tres

Si los lees seguidos vas a notar lo mismo. Los tres resuelven el mismo problema de fondo, poder regresar a algo anterior.

  • Balanced parentheses: recordar la última apertura para validar el cierre.
  • Reverse string: regresar al orden opuesto.
  • Simplify path: .. regresa un nivel.

Ese es el superpoder del stack. Cuando un problema te pide recordar lo último, deshacer algo o procesar de atrás hacia adelante, casi siempre la respuesta es stack.

Stacks más allá de las entrevistas

Los stacks no son trivia de entrevistas. El patrón de "regresar" aparece por todos lados:

  • El botón de regresar del navegador es un stack.
  • El undo/redo de tu editor también.
  • Los call stacks de los lenguajes (por eso existen los stack overflow errors).
  • Pipelines de datos que necesitan mantener contexto de lo último visto.

Para seguir practicando

Problemas de LeetCode ordenados por dificultad:

  1. Min Stack, easy.
  2. Baseball Game, easy.
  3. Evaluate Reverse Polish Notation, medium.
  4. Daily Temperatures, medium. Es la intro al patrón de monotonic stack.

¿Cuál te costó más? Déjamelo en los comentarios. A mí Simplify Path me hizo dar más vueltas para resolverlo.