2010-06-04 4 views
0

Je dois implémenter stac dans Prolog, mais SANS utiliser la liste. Chaque élément de la pile doit pointer vers avant l'élément.
Est-il possible de le faire? Puis-je définir des règles dans le programme d'exécution? (Comme:?. element('foo','bar'). où foo est le contenu de la barre d'extrémité de l'élément est pointeur vers un autrePROLOG - Comment implémenter la pile?

Répondre

1

pointeur dans la pile Je pense que vous avez la définition mêlé Je pense que vous voulez dire la liste chaînée

Liste de liens est une donnée. structure dans laquelle un élément pointe à l'élément suivant, entraînant une croissance très flexible et retrait des données.

Stack est une structure de données qui utilise la dernière en premier sorti.

et oui pile peut être écrit sans liste, et ainsi liste chaînée, la liste Array est moins polyvalente que la liste chaînée mais aucune moins, il a la plupart des fonctionnalités de la liste liée.

+0

... mais dans Stack, l'élément doit aussi avoir un pointeur vers un autre élément! Pile sur les tableaux est inutile alors je voulais dire Stack comme liste liée http://en.wikipedia.org/wiki/Stack_(data_structure)#Implementation – Rick

+0

si vous faites en sorte que l'index suivant est l'élément suivant, ce ne sera pas un problème . Et pile dans sa nature est au format tableau. Avoir un pointeur en pile est inutile. Mais si vous voulez vraiment faire une pile où il y a un pointeur vers l'élément suivant, vous pouvez le faire oui, bien que son efficacité soit discutable. plusieurs façons de le faire, mais depuis que je suis un gars mathématique, j'aurais un nombre impair en tant qu'élément et même numéro index comme un pointeur vers l'indice suivant ou l'élément suivant. Ou vous pouvez faire entièrement nouvel objet avec itérateur. – Anatoli

+1

"Et la pile dans sa nature est au format tableau." Dit qui? Les listes à lien unique fonctionnent parfaitement comme des piles. – sepp2k

2

Alors, quel est le problème? Votre question est déjà la réponse. Votre 'bar' doit contenir element(X,Y) ou une sorte de bottom.

stack_empty(bottom). 
stack_push(S, X, element(X, S)). 

revlist_push(S0, [], S0). 
revlist_push(S0, [X|T], S):- 
    stack_push(S0, X, S1), 
    revlist_push(S1, T, S). 

revlist_pop(S0, []):- stack_empty(S0). % bottom of stack 
revlist_pop(S0, [X|T]):- 
    stack_push(S1, X, S0), % pop - is reverse push 
    revlist_pop(S1, T). 

revlist(L0, L):- 
    stack_empty(S0), 
    revlist_push(S0, L0, S), 
    revlist_pop(S, L). 

En fait, les listes dans des langages tels que Prolog sont généralement représentées par des données récursives. cons(a, cons(b, cons(c, nil))) ou simplement [a | [b | [c | [] ]]].