📚 Stack and Queue in Python
Stack and Queue are data structures used to store and manage data in a particular order.
🥞 Stack — LIFO
LIFO = Last In, First Out
The item added last is removed first.
Think of a stack of plates:
┌───────┐
│ 3 │ ← Last in → First out
├───────┤
│ 2 │
├───────┤
│ 1 │
└───────┘Using a List
stack = []
stack.append(10)
stack.append(20)
stack.append(30)
print(stack) #[10, 20, 30]Remove the last item using pop():
stack.pop() #30So:
Push → Add an item
Pop → Remove the last itemExample Uses
↩️ Undo/Redo
🌐 Browser history
🧮 Expression evaluation
🔄 Function call stack
🚶 Queue — FIFO
FIFO = First In, First Out
The item added first is removed first.
Think of people standing in a queue:
First Last
↓ ↓
[10] → [20] → [30] → [40]
↓
Removed firstPython provides deque for efficient queues:
from collections import deque
queue = deque()
queue.append(10)
queue.append(20)
queue.append(30)
print(queue) #deque([10, 20, 30])Remove the first item using popleft():
queue.popleft() #10So:
Enqueue → Add an item
Dequeue → Remove the first itemExample Uses
🖨️ Print queues
🎫 Ticket systems
💬 Task processing
🌐 Network requests
⚖️ Stack vs Queue
Stack 🥞 | Queue 🚶 |
|---|---|
LIFO | FIFO |
Last In, First Out | First In, First Out |
Add/remove from the same end | Add at one end, remove from the other |
|
|
Usually implemented using | Usually implemented using |
<div class="infographic-pystackq">
<style>
.infographic-pystackq {
--ink: #1a1a1a;
--ink-soft: #5c5c5c;
--paper: #ffffff;
--paper-alt: #f0ece4;
--accent: #2563eb;
--accent-soft:#e3ebfd;
--line: #ddd6c9;
--mono-font: 'IBM Plex Mono', 'SFMono-Regular', Menlo, monospace;
--display-font: 'Fraunces', Georgia, serif;
--body-font: 'Inter', system-ui, sans-serif;
box-sizing: border-box;
max-width: 720px;
margin: 0 auto;
font-family: var(--body-font);
color: var(--ink);
background: var(--paper);
}
.infographic-pystackq[data-theme="dark"] {
--ink: #e8e6e1;
--ink-soft: #9a968c;
--paper: #121212;
--paper-alt: #1e1e26;
--accent: #5b8def;
--accent-soft:#202942;
--line: #2c313d;
}
.infographic-pystackq *, .infographic-pystackq *::before, .infographic-pystackq *::after { box-sizing: border-box; }
.infographic-pystackq .sq-wrap { padding: 0 clamp(1rem, 4vw, 2rem) 1.5rem; }
.infographic-pystackq h1 {
font-family: var(--display-font); font-weight: 600;
font-size: clamp(1.5rem, 5vw, 2.05rem); text-align: center; margin: 1.5rem 0 0.25rem; letter-spacing: -0.01em;
}
.infographic-pystackq .sq-sub { text-align: center; color: var(--ink-soft); font-size: 0.86rem; margin: 0 0 1.4rem; }
.infographic-pystackq .sq-tabs { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 1.4rem; border-bottom: 1px solid var(--line); }
.infographic-pystackq .sq-tab-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.82rem; font-weight: 700;
background: none; border: none; border-bottom: 2.5px solid transparent; color: var(--ink-soft);
padding: 0.55rem 0.9rem; cursor: pointer; margin-bottom: -1px;
}
.infographic-pystackq .sq-tab-btn.is-active { color: var(--accent); border-bottom-color: var(--accent); }
.infographic-pystackq .sq-panel.is-hidden-tab { display: none; }
.infographic-pystackq .decl-line { text-align: center; font-family: var(--mono-font); font-size: 0.8rem; color: var(--ink-soft); margin-bottom: 1rem; }
.infographic-pystackq .input-row { display: flex; justify-content: center; gap: 0.4rem; margin-bottom: 0.9rem; flex-wrap: wrap; }
.infographic-pystackq .input-row input {
font-family: var(--mono-font); font-size: 0.85rem; padding: 0.4rem 0.6rem;
border: 1.5px solid var(--line); border-radius: 5px; background: var(--paper-alt); color: var(--ink); width: 90px;
text-align: center;
}
.infographic-pystackq .input-row input:focus { outline: none; border-color: var(--accent); }
.infographic-pystackq .sq-btn {
font: inherit; font-family: var(--mono-font); font-size: 0.82rem; font-weight: 700;
background: var(--accent); color: #fff; border: none; border-radius: 6px;
padding: 0.42rem 0.85rem; cursor: pointer;
}
.infographic-pystackq .sq-btn.secondary { background: var(--paper-alt); color: var(--ink); border: 1.5px solid var(--line); }
.infographic-pystackq .sq-btn:disabled { opacity: 0.5; cursor: default; }
/* stack visual */
.infographic-pystackq .stack-stage {
display: flex; align-items: center; justify-content: center; gap: 0.8rem; margin-bottom: 1rem; min-height: 220px;
}
.infographic-pystackq .stack-col { display: flex; flex-direction: column; align-items: center; min-height: 220px; justify-content: flex-end; gap: 0.3rem; }
.infographic-pystackq .stack-box, .infographic-pystackq .queue-box {
font-family: var(--mono-font); font-size: 0.88rem; font-weight: 700; text-align: center;
padding: 0.5rem 0.9rem; border-radius: 7px; border: 2px solid var(--accent); background: var(--accent-soft); color: var(--accent);
min-width: 70px; animation: sq-pop 0.25s ease;
}
@keyframes sq-pop { from { opacity: 0; transform: scale(0.7); } to { opacity: 1; transform: scale(1); } }
.infographic-pystackq .stack-box.top, .infographic-pystackq .queue-box.front {
border-color: var(--ink); box-shadow: 0 0 0 2px var(--accent-soft);
}
.infographic-pystackq .stack-empty, .infographic-pystackq .queue-empty {
font-family: var(--mono-font); font-size: 0.8rem; color: var(--ink-soft);
}
.infographic-pystackq .side-label {
font-family: var(--mono-font); font-size: 0.72rem; font-weight: 700; color: var(--ink-soft);
writing-mode: vertical-rl; text-orientation: mixed; text-align: center;
}
/* queue visual */
.infographic-pystackq .queue-stage { display: flex; align-items: center; justify-content: center; gap: 0.9rem; margin-bottom: 1rem; min-height: 90px; flex-wrap: nowrap; overflow-x: auto; padding: 0.3rem; }
.infographic-pystackq .queue-row { display: flex; gap: 0.4rem; align-items: center; }
.infographic-pystackq .end-label { font-family: var(--mono-font); font-size: 0.68rem; font-weight: 700; color: var(--ink-soft); text-align: center; white-space: nowrap; }
.infographic-pystackq .len-badge {
display: block; text-align: center; font-family: var(--mono-font); font-size: 0.75rem; color: var(--accent);
font-weight: 700; margin-bottom: 1rem;
}
/* terminal log — always dark */
.infographic-pystackq .device {
--ed-bg: #1e1e1e; --ed-bar: #2d2d2d; --ed-text: #d4d4d4; --ed-soft: #8a8a8a; --ed-ok: #6fdc8c; --ed-err: #ff6b6b;
background: var(--ed-bg); border: 1px solid var(--line); border-radius: 8px; overflow: hidden;
}
.infographic-pystackq .device-bar {
display: flex; align-items: center; gap: 0.4rem;
background: var(--ed-bar); padding: 0.5rem 0.7rem; border-bottom: 1px solid #3a3a3a;
font-size: 0.72rem; color: var(--ed-soft); font-weight: 600;
}
.infographic-pystackq .device-bar .dot { width: 9px; height: 9px; border-radius: 50%; background: #5a5a5a; }
.infographic-pystackq .device-bar .dot:nth-child(1) { background: #ff5f56; }
.infographic-pystackq .device-body {
padding: 0.8rem 0.9rem; font-family: var(--mono-font); font-size: 0.78rem; color: var(--ed-text);
min-height: 50px; max-height: 150px; overflow-y: auto;
}
.infographic-pystackq .log-line { display: flex; gap: 0.5rem; line-height: 1.6; opacity: 0; animation: sq-fadein 0.25s ease forwards; flex-wrap: wrap; }
@keyframes sq-fadein { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }
.infographic-pystackq .log-line .p { color: var(--ed-ok); font-weight: 700; }
.infographic-pystackq .log-line .arrow { color: var(--ed-soft); }
.infographic-pystackq .log-line .res { color: #fff; }
.infographic-pystackq .log-line.err .res { color: var(--ed-err); }
.infographic-pystackq .log-empty { color: var(--ed-soft); }
.infographic-pystackq .reset-row { display: flex; justify-content: center; margin-bottom: 0.9rem; }
.infographic-pystackq .reset-btn {
font: inherit; font-size: 0.78rem; font-weight: 600; color: var(--ink-soft);
background: none; border: 1px solid var(--line); padding: 0.35rem 0.7rem; cursor: pointer; border-radius: 4px;
}
@media (prefers-reduced-motion: reduce) {
.infographic-pystackq *, .infographic-pystackq *::before, .infographic-pystackq *::after {
animation-duration: 0.001ms !important; transition-duration: 0.001ms !important;
}
}
</style>
<div class="sq-wrap">
<h1>Stack & Queue</h1>
<p class="sq-sub">Same idea, opposite doors — last one in first out, or first one in first out.</p>
<div class="sq-tabs">
<button class="sq-tab-btn is-active" data-tab="stack">Stack — LIFO</button>
<button class="sq-tab-btn" data-tab="queue">Queue — FIFO</button>
</div>
<!-- STACK TAB -->
<div class="sq-panel" id="tabStack">
<p class="decl-line">stack = [] · stack.append(x) to push · stack.pop() to pop</p>
<div class="input-row">
<input id="stackInput" type="text" value="C" maxlength="6" />
<button class="sq-btn" id="pushBtn">push(x)</button>
<button class="sq-btn secondary" id="popBtn">pop()</button>
</div>
<div class="stack-stage">
<span class="side-label">← top (push / pop here)</span>
<div class="stack-col" id="stackCol"></div>
</div>
<span class="len-badge" id="stackLenBadge">len(stack) = 2</span>
<div class="device">
<div class="device-bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span> History</div>
<div class="device-body" id="stackLog"><div class="log-empty">push or pop to see it here…</div></div>
</div>
<div class="reset-row"><button class="reset-btn" id="stackReset">↺ Reset stack</button></div>
</div>
<!-- QUEUE TAB -->
<div class="sq-panel is-hidden-tab" id="tabQueue">
<p class="decl-line">from collections import deque · queue.append(x) to enqueue · queue.popleft() to dequeue</p>
<div class="input-row">
<input id="queueInput" type="text" value="C" maxlength="6" />
<button class="sq-btn" id="enqueueBtn">enqueue(x)</button>
<button class="sq-btn secondary" id="dequeueBtn">dequeue()</button>
</div>
<div class="queue-stage">
<span class="end-label">front<br>(dequeue here)</span>
<div class="queue-row" id="queueRow"></div>
<span class="end-label">back<br>(enqueue here)</span>
</div>
<span class="len-badge" id="queueLenBadge">len(queue) = 2</span>
<div class="device">
<div class="device-bar"><span class="dot"></span><span class="dot"></span><span class="dot"></span> History</div>
<div class="device-body" id="queueLog"><div class="log-empty">enqueue or dequeue to see it here…</div></div>
</div>
<div class="reset-row"><button class="reset-btn" id="queueReset">↺ Reset queue</button></div>
</div>
</div>
<script>
(function () {
var root = document.currentScript.closest('.infographic-pystackq')
|| document.querySelector('.infographic-pystackq');
var bodyAttr = document.body.getAttribute('data-darkmode');
var dark;
if (bodyAttr === 'true') { dark = true; }
else if (bodyAttr === 'false') { dark = false; }
else {
var match = document.cookie.match(/(?:^|;\s*)darkMode=([^;]+)/);
dark = match ? match[1] === 'true' : false;
}
if (dark) root.setAttribute('data-theme', 'dark');
/* ---------------- tabs ---------------- */
var tabBtns = root.querySelectorAll('.sq-tab-btn');
var panels = { stack: root.querySelector('#tabStack'), queue: root.querySelector('#tabQueue') };
tabBtns.forEach(function (btn) {
btn.addEventListener('click', function () {
tabBtns.forEach(function (b) { b.classList.toggle('is-active', b === btn); });
var target = btn.dataset.tab;
Object.keys(panels).forEach(function (key) {
panels[key].classList.toggle('is-hidden-tab', key !== target);
});
});
});
function logLine(logEl, code, result, isErr) {
var line = document.createElement('div');
line.className = 'log-line' + (isErr ? ' err' : '');
line.innerHTML = '<span class="p">>>></span><span>' + code + '</span>' +
(result !== undefined ? '<span class="arrow">→</span><span class="res">' + result + '</span>' : '');
logEl.appendChild(line);
logEl.scrollTop = logEl.scrollHeight;
}
/* ---------------- STACK ---------------- */
var INITIAL_STACK = ['A', 'B'];
var stack = INITIAL_STACK.slice();
var stackCol = root.querySelector('#stackCol');
var stackLenBadge = root.querySelector('#stackLenBadge');
var stackLog = root.querySelector('#stackLog');
var stackFirstLog = true;
function renderStack() {
stackCol.innerHTML = '';
if (stack.length === 0) {
var empty = document.createElement('div');
empty.className = 'stack-empty';
empty.textContent = 'empty stack';
stackCol.appendChild(empty);
} else {
stack.slice().reverse().forEach(function (v, i) {
var box = document.createElement('div');
box.className = 'stack-box' + (i === 0 ? ' top' : '');
box.textContent = v;
stackCol.appendChild(box);
});
}
stackLenBadge.textContent = 'len(stack) = ' + stack.length;
}
root.querySelector('#pushBtn').addEventListener('click', function () {
var v = root.querySelector('#stackInput').value.trim() || 'x';
if (stackFirstLog) { stackLog.innerHTML = ''; stackFirstLog = false; }
stack.push(v);
renderStack();
logLine(stackLog, 'stack.append("' + v + '")', '[' + stack.map(function (x) { return '"' + x + '"'; }).join(', ') + ']');
});
root.querySelector('#popBtn').addEventListener('click', function () {
if (stackFirstLog) { stackLog.innerHTML = ''; stackFirstLog = false; }
if (stack.length === 0) {
logLine(stackLog, 'stack.pop()', 'IndexError: pop from empty list', true);
return;
}
var popped = stack.pop();
renderStack();
logLine(stackLog, 'stack.pop()', '"' + popped + '" ← last one in, first one out');
});
root.querySelector('#stackReset').addEventListener('click', function () {
stack = INITIAL_STACK.slice();
stackFirstLog = true;
stackLog.innerHTML = '<div class="log-empty">push or pop to see it here…</div>';
renderStack();
});
/* ---------------- QUEUE ---------------- */
var INITIAL_QUEUE = ['A', 'B'];
var queue = INITIAL_QUEUE.slice();
var queueRow = root.querySelector('#queueRow');
var queueLenBadge = root.querySelector('#queueLenBadge');
var queueLog = root.querySelector('#queueLog');
var queueFirstLog = true;
function renderQueue() {
queueRow.innerHTML = '';
if (queue.length === 0) {
var empty = document.createElement('div');
empty.className = 'queue-empty';
empty.textContent = 'empty queue';
queueRow.appendChild(empty);
} else {
queue.forEach(function (v, i) {
var box = document.createElement('div');
box.className = 'queue-box' + (i === 0 ? ' front' : '');
box.textContent = v;
queueRow.appendChild(box);
});
}
queueLenBadge.textContent = 'len(queue) = ' + queue.length;
}
root.querySelector('#enqueueBtn').addEventListener('click', function () {
var v = root.querySelector('#queueInput').value.trim() || 'x';
if (queueFirstLog) { queueLog.innerHTML = ''; queueFirstLog = false; }
queue.push(v);
renderQueue();
logLine(queueLog, 'queue.append("' + v + '")', '[' + queue.map(function (x) { return '"' + x + '"'; }).join(', ') + ']');
});
root.querySelector('#dequeueBtn').addEventListener('click', function () {
if (queueFirstLog) { queueLog.innerHTML = ''; queueFirstLog = false; }
if (queue.length === 0) {
logLine(queueLog, 'queue.popleft()', 'IndexError: pop from an empty deque', true);
return;
}
var dequeued = queue.shift();
renderQueue();
logLine(queueLog, 'queue.popleft()', '"' + dequeued + '" ← first one in, first one out');
});
root.querySelector('#queueReset').addEventListener('click', function () {
queue = INITIAL_QUEUE.slice();
queueFirstLog = true;
queueLog.innerHTML = '<div class="log-empty">enqueue or dequeue to see it here…</div>';
renderQueue();
});
renderStack();
renderQueue();
})();
</script>
</div>