스택을 연결리스트로 구현한다. top 은 헤더역할을 하고 새로운 노드가 push되면 top은 새로운 노드를 가리킨다.
top의 위치가 헷갈렸다. 새 노드를 마지막노드 다음에 붙이고 거기에 top이 가리키게 한다..
이렇게 하면 삭제와 탐색이 불편해진다. 먼저 pop하기 위해서는 마지막의 이전노드가 필요하고, 탐색하려면 새로운 포인터가 첫 노드를 가리키고 탐색을 시작해야한다. 물론 어렵진 않다.
항상 새로운 노드를 push 할때는 마지막 노드의 주소를 다른 포인터변수에 넣어놓으면 그 주소는 새노드의 이전노드가 된다. 그리고 탐색은 head 역할하는 포인터가 있어야 할 듯하다.. 거의 queue 화 되가는 듯..
top이 가리키고 있는 노드가 최신노드이다. 새로운 노드를 push하면 새 노드의 링크필드에 top의 값을 넣고 top은 다시 새 노드의 값는 갖는다. 이렇게 함으로서 top은 새로운 노드를 가리키게 되고 새로운 노드는 다음 노드를 가리킨다.
void push(int d){
Node * temp = (Node *)malloc(sizeof(Node));
temp->data = d;
temp->next = top;
top = temp;
}
pop을 수행하면 top은 top의 링크필드 값을 갖고 다음 노드를 가리킨다. 그리고 pop될 노드는 free(void *)로 메모리 해제를 한다. 물론 그전에 pop할 노드를 가리킬 포인터 변수를 하나 만들어놓아야 하지 않을까 싶다.
int pop(){
if(isStackEmpty()) return -1;
int data = top->data;
Node * temp = top;
top = top->next;
free(temp);
return data;
}
역시나 연결리스트가 array보다 유연하다. 하지만 적은 데이터(최대갯수를 어느정도 정할 수 있는)가 매우 많이 push와 pop이 일어난다면 array가 더 효율적이지 않을까 싶다. array는 연속된 메모리가 할당되기 때문에 더 빠르게 접근이 가능하고 더 적은 공간과 간결한 명령어로 구현하기때문이다. 케바케로 선택하면 될 듯하다.
'C' 카테고리의 다른 글
stack & heap in Visual Studio (0) | 2022.05.25 |
---|---|
magic debug value (1) | 2022.05.25 |
매개변수에 전역변수 (0) | 2022.05.13 |
LinkedList (0) | 2022.05.10 |
shallow & deep copy (0) | 2022.04.27 |