Création d'une file d'attente FIFO en C
Est-il possible de créer une FIFO "pile" en C sans l'aide de 2 piles?
Merci!
(Désolé pour ceux qui ont répondu à la précédente. Je pensais à ce PRINCIPE et le sens de la FIFO.)
Vous devez vous connecter pour publier un commentaire.
C'est très facile.
Mettre en œuvre une liste à double liaison, en maintenant le pointeur vers le dernier élément de la liste.
À ajouter à la file d'attente, de créer un nouveau nœud au début, en le reliant à la précédente au début. (normal liste insert)
Supprimer de la file d'attente, deref le pointeur sur le dernier élément, modifier le pointeur de la précédente-pointeur d'élément, et renvoie le dernier élément... (C'est pourquoi la double liaison de la liste. L'autre option est une liste liée individuellement et d'une itération à l'ensemble de la liste pour obtenir des pointeurs vers les deux derniers éléments).
Il semble que vous essayez de faire une file d'attente, où vous insérez à une extrémité et tirez de l'autre.
Une façon de le faire est avec une liste chaînée. Vous pouvez stocker des pointeurs vers la tête et la queue. Lorsque vous insérez, ajouter le nouvel enregistrement à la queue et quand vous sautez quelque chose de la file d'attente, vous prenez le nœud pointé par le pointeur de tête. (Ou vice-versa, il n'a pas beaucoup d'importance)
Ne serait-ce pas juste être une norme liée liste, si vous ne définissez des fonctions pour retirer l'élément de tête et de pousser des trucs sur la queue de l'élément? Vous pouvez même le faire dans une seule liste, avec une queue de pointeur, plutôt qu'une liste à double liaison.
À l'aide de 2 piles pour c'est une drôle de solution, et un lent. Pourquoi êtes-vous de mentionner la pile lorsque vous pouvez utiliser un simple file d'attente? C'est FIFO vous voulez, non? Vous pouvez utiliser un tableau pour faire une file d'attente, moduloing sa longueur pour en faire de la circulaire.
Vous pouvez également mettre en place une file d'attente avec un tableau circulaire.
Bien que correct solutions sont d'ores et déjà proposé, j'aimerais juste corriger FIFO n'est pas vraiment une pile.
Cette question est souvent trouvé dans les Algorithmes de la classe, où ils vous demandent de vous en construire un à partir de piles, et de prouver que le coût amorti pour l'insertion et le retrait est O(1).
Fifo peut être construit en utilisant la double liaison de la liste, une matrice/vecteur avec un début et de fin de pointeur, circulaires, tableaux, etc etc...
Je pense que l'OP a voulu savoir comment le gérer si tout ce qu'il a, c'est des piles, peu importe les arcanes de la raison. L'astuce est de se rappeler que pousser des trucs sur une pile, puis à éclater hors tension inverse l'ordre des éléments, de sorte que vous pouvez utiliser deux piles de renverser deux fois.
Les éléments entrants obtenir poussé sur stack1, et sont tous sauté sur stack2 quand stack2 est vide. De sorte que le premier élément est poussé sur stack1, immédiatement sauté et poussé sur stack2, prêt pour la sortie. Les autres éléments de la pile sur stack1 jusqu'à stack2 est sorti, à quel point le dernier élément va sur stack2, puis l'avant-dernier et ainsi de suite jusqu'à ce que stack1 est à nouveau vide. Maintenant, tous les éléments sont restacked sur stack2, avec le plus récent en bas et le plus ancien en haut. Nouvelle pousse de continuer à bâtir sur stack1, en attendant stack2 de devenir de nouveau vide, et stack2 seulement produit les éléments dans l'ordre d'origine jusqu'à ce qu'il est vide, à quel point nous répéter les dépiler-réorganiser l'ordre du processus.
Je ne commenterai pas sur de l'efficacité, etc.; c'est juste ", vous pouvez le faire de cette façon". On m'a demandé dans une interview et ma réponse fut: "Quel genre d'idiot serait ne qui? Mettre en œuvre une réelle attente et être fait avec elle" - je ne pense pas que c'était la réponse qu'ils cherchaient bien.