Piles et files : LIFO contre FIFO
IntermédiaireDeux ordres de traitement opposés à reconnaître dès l'énoncé.
- Pile (stack) : dernier entré, premier sorti.
push/popdu même côté, en O(1). - File (queue) : premier entré, premier sorti.
enqueued'un côté,dequeuede l'autre, en O(1).
| Signal dans l'énoncé | Structure |
|---|---|
| Parenthèses valides, annuler la dernière action, évaluer une expression, DFS itératif | Pile |
| Traiter dans l'ordre d'arrivée, parcours en largeur (BFS), ordonnancement | File |
Parenthèses valides#
Chaque fermante doit correspondre à la dernière ouvrante non fermée : c'est exactement une pile.
function isValid(s: string): boolean {
const pairs: Record<string, string> = { ")": "(", "]": "[", "}": "{" };
const stack: string[] = [];
for (const c of s) {
if (c in pairs) {
if (stack.pop() !== pairs[c]) return false;
} else {
stack.push(c);
}
}
return stack.length === 0;
}
Pile monotone : prochain élément plus grand#
On garde des indices dont les valeurs sont décroissantes ; un nouvel élément plus grand « résout » tous ceux qu'il dépasse. Chaque indice entre et sort une fois : O(n) au lieu de O(n²).
function nextGreater(nums: number[]): number[] {
const result = new Array<number>(nums.length).fill(-1);
const stack: number[] = []; // indices, valeurs décroissantes
for (let i = 0; i < nums.length; i++) {
while (stack.length && nums[stack[stack.length - 1]] < nums[i]) {
result[stack.pop()!] = nums[i];
}
stack.push(i);
}
return result;
}
Piège : en JavaScript, utiliser un tableau comme file avec
shift()coûte O(n) (tous les éléments sont décalés). Pour une vraie file, gardez un index de tête, ou utilisez une liste chaînée /deque(collections.dequeen Python).
Pour aller plus loin#
- Data structures: Introduction to stack — mycodeschool
- Data structures: Introduction to Queues — mycodeschool