web-dev-qa-db-fra.com

Piles, files d'attente et listes liées

J'ai commencé à apprendre Structures de données récemment, et je viens d'avoir mon propre linked list la mise en oeuvre.

Maintenant, je suis tombé sur deux nouvelles structures de données: stack et queue.
D'après ce que j'ai appris jusqu'à présent
stack est un linked list qui permet l'insertion/le retrait uniquement de sa queue, et
queue est un linked list qui permet l'insertion uniquement au niveau de sa queue et le retrait uniquement de sa tête.

Mes questions sont:
Pourquoi devrais-je utiliser ces deux structures de données au lieu d'un linked list qui permet l'insertion et le retrait de n'importe où?
Aussi, pourquoi ces deux structures de données sont-elles classées comme des structures de données indépendantes plutôt que comme des "listes liées à accès limité"?

10
Hamed Khaled

Les piles et les files d'attente ont leur propre raison d'exister. Une pile est une structure de données FILO (First In Last Out) ou LIFO (dans les deux sens) qui pourrait être implémentée à l'aide de tableaux, de listes liées ou d'autres formulaires. Tenez compte de l'historique du navigateur. Vous accédez à Site A -> puis [~ # ~] b [~ # ~] -> puis [~ # ~] c [~ # ~] -> [~ # ~] d [~ # ~]. Lorsqu'un utilisateur avance, vous devez d'abord Pousser (insérer à la fin) la liste des sites Web. Cela garantit que le site actuel est toujours en haut de la pile. Stack in action

Ensuite, lorsque l'utilisateur appuie sur le bouton de retour, vous pop celui du haut (retrait de la queue - la même extrémité utilisée pour l'insertion) qui donne le dernier visité site - [~ # ~] c [~ # ~]. Ainsi, le concept de First In (qui était Site A) et Last Out (le dernier à entrer était Site D qui à son tour est devenu le premier sortir)

On pourrait dire la même chose pour la file d'attente qui est FIFO (First In First Out). Prenons l'exemple de la file d'attente des travaux. Lors de l'exécution d'un travail, vous (en ne considérant aucun algorithme d'optimisation) serviriez celui en premier Cela fait de la file d'attente une excellente structure de données pour traiter les travaux selon le principe du premier arrivé, premier servi.

Dans les deux cas, vous ne voudriez pas une suppression ou une insertion arbitraire d'éléments à n'importe quel index. Non, cela entraînerait un comportement indésirable. D'où la nécessité d'une pile/file d'attente. Je voudrais à nouveau souligner que les piles/files d'attente peuvent être mises en œuvre en appliquant des restrictions sur les listes liées.

Désolé pour la mauvaise qualité d'image - je viens de la dessiner dans Paint.

19
Slartibartfast

La pile est essentiellement une structure de données qui suit LIFO (LAST IN FIRST OUT). La file d'attente est celle qui suit FIFO (FIRST IN FIRST OUT)).

En général, Stacks et Queues peuvent être implémentés à l'aide de Arrays et Linked Lists.

La raison pour laquelle vous utiliseriez Linked List pour implémenter Stack, c'est lorsque vous avez besoin d'une fonctionnalité impliquant le formulaire LAST IN FIRST OUT et que vous ne savez pas combien d'éléments cette fonctionnalité requiert. Vous utiliserez donc LinkedList pour créer des nœuds de façon dynamique en fonction des besoins.

Il en va de même pour Queues

La raison pour laquelle les deux sont indépendants est parce que les deux suivent des principes différents, c'est-à-dire LIFO et FIFO respectivement.

3
yyk