본문 바로가기

C/Reference

[C] 단일 연결 리스트로 구현한 스택

반응형

출처 - C로 배우는 알고리즘 (이재규 지음)

#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
	int key;
	struct _node *next;
}node;

void init_stack();	// head와 tail 메모리 할당, head가 가리키는 다음 노드 tail로 초기화, tail이 가리키는 다음 노드 자기자신으로 초기화
int push(int key);	// head 다음에 노드 추가, 메모리 부족으로 할당 실패시 -1 리턴
int pop();		// 입력된 값이 아무것도 없을 경우 -1 리턴
void clear_stack();	// 스택의 모든 노드를 메모리 해제
void print_stack();	// 스택의 모든 내용을 출력

node *head, *tail;

int main(int argc, char *argv[], char **env)
{
	int i = 0;
	init_stack();

	printf("Push 5, 4, 7, 8, 2, 1\n");
	push(5);
	push(4);
	push(7);
	push(8);
	push(2);
	push(1);
	print_stack();
	puts("");

	printf("pop\n");
	i = pop();
	print_stack();
	printf("popping value is %d\n", i);
	puts("");

	printf("Push 3, 2, 5, 7, 2\n");
	push(3);
	push(2);
	push(5);
	push(7);
	push(2);
	print_stack();
	puts("");

	printf("push 3\n");
	push(3);
	print_stack();
	puts("");

	printf("Initialize stack\n");
	clear_stack();
	print_stack();
	puts("");

	printf("Now stack is empty, pop\n");
	i = pop();
	print_stack();
	printf("popping value is %d\n", i);

	return 0;
}

void init_stack()
{
	head = (node *)calloc(sizeof(node), 1);
	tail = (node *)calloc(sizeof(node), 1);

	head->next = tail;
	tail->next = tail;
}
int push(int key)
{
	node *new_node = NULL;

	if((new_node = (node *)calloc(sizeof(node), 1)) == NULL)
	{
		printf("Out of memory...\n");
		return -1;
	}

	new_node->key = key;
	new_node->next = head->next;
	head->next = new_node;

	return key;
}

int pop()
{
	node *t = NULL;
	int i = 0;

	if(head->next == tail)
	{
		printf("Stack underflow\n");
		return -1;
	}

	t = head->next;
	i = t->key;
	head->next = t->next;

	free(t);

	return i;
}

void clear_stack()
{
	node *t = NULL, *s = NULL;

	t = head->next;

	while(t != tail)
	{
		s = t;
		t = t->next;
		free(s);
	}

	head->next = tail;
}

void print_stack()
{
	node *t = NULL;

	if(head->next == tail)
	{
		printf("Stack is empty...\n");
		return;
	}

	t = head->next;

	while(t != tail)
	{
		printf("%-6d", t->key);
		t = t->next;
	}

	puts("");
}

 

반응형

'C > Reference' 카테고리의 다른 글

[C] 단일 연결 리스트 (Simple Linked List)  (0) 2024.12.18
[C] 이중 연결 리스트 (Double Linked List)  (0) 2024.12.18
[C] 이중 연결 리스트로 구현한 큐  (0) 2024.12.18
[C] 선택 정렬  (0) 2024.12.18
[C] 삽입 정렬  (0) 2024.12.18