2010-06-04 5 views
0

필자는 Prolog에서 stac을 구현해야하지만 목록을 사용하지 않아야합니다. 스택의 각 요소는 before 요소를 가리켜 야합니다.
가능합니까? 런타임 프로그램에서 규칙을 정의 할 수 있습니까? (같은 :?. foo는이 요소의 끝 줄의 함량이 element('foo','bar').이 다른 포인터를 스택PROLOG - 스택 구현 방법은 무엇입니까?

답변

1

포인터 난 당신이 정의가 혼합 생각 나는 당신이 연결된 목록을 의미 생각

링크 된 목록은 데이터입니다. 하나 개의 요소는 매우 유연 증가 및 데이터의 수축의 결과, 다음의 요소를 가리키는 구조.

스택

. 제 아웃 마지막 이용하는 데이터 구조이며, 네 스택리스트없이 기록 될 수 있으며, 그래서 링크리스트 가능, 배열리스트는 링크리스트로서 다용도는 아니지만 적은, 그것은 대부분의 연결 목록 기능을 가지고 있습니다.

+0

...하지만 스택에서 요소는 다른 요소에 대한 포인터도 가져야합니다! 나는 연결리스트 http://en.wikipedia.org/wiki/Stack_(data_structure)#Implementation – Rick

+0

로 스택을 의미하므로 그 다음 인덱스는 다음 요소가 그래서, 그것은 문제가되지 않습니다 할 경우 배열에 스택은 무의미 . 그리고 자연의 배열은 배열 형식입니다. 스택에 포인터가 있으면 무의미합니다. 하지만 당신은 정말 다음 요소에 대한 포인터를 가지고 스택을 할 경우의 효율성이 의심하지만, 당신이, 그래 그것을 할 수 있습니다. 방법은 여러 가지가 그것을 할 수 있습니다,하지만 난이 mathmatical 사람이야 이후, 나는 요소와 다음 인덱스 또는 다음 요소에 대한 포인터로 짝수 인덱스로 홀수있을 것입니다. 또는 iterator를 사용하여 완전히 새로운 객체를 만들 수 있습니다. – Anatoli

+1

"자연의 스택은 배열 형식입니다." 누가 그래? 단독 링크 된 목록은 스택처럼 완벽하게 작동합니다. – sepp2k

2

그래서 무엇이 문제입니까? 귀하의 질문은 이미 답변입니다. 'bar'에는 element(X,Y) 또는 어떤 종류의 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). 

사실은 일반적으로 재귀 적 데이터로 표현 프롤로그처럼 같은 언어로 나열되어 있습니다. cons(a, cons(b, cons(c, nil))) 또는 간단히 [a | [b | [c | [] ]]]입니다.