본문 바로가기
알고리즘창고

[C] 단일연결리스트 기반 스택 (single linked list stack)

by 야호호코코 2018. 7. 9.
반응형

 C로 스택을 구현할 때 가장 많이 쓰는 자료구조중 하나가 연결리스트이다. 크기에 제한없이 스택을 사용할 수 있다는 장점이 있으나 메모리 측면에서 배열을 이용했을 때보다 비효율적이다. 연결리스트에 있는 모든 노드에는 항상 자기 이외의 노드를 가리키는 포인터 변수가 1개 이상 존재하기 때문이다.


 본 프로그램 코드는 단일 연결리스트 기반으로 만든 스택을 사용자가 직접 이용할 수 있게 만든 것이다. 스택에 들어갈 수 있는 값은 하나의 정수이다.


 명령어


 push N -> 정수 N을 push한다

 pop -> 스택을 pop하고 그 값을 출력한다. 스택이 비어있으면 Stack Empty 출력

 size -> 스택의 크기를 출력한다.

 top -> top에 위치한 값을 출력한다. 스택이 비어있으면 Stack Empty 출력

 print -> 스택 내 모든 값들을 출력한다. 스택이 비어있으면 Stack Empty 출력

 exit -> 프로그램 종료


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

typedef struct Node {

	int n;

	struct Node *next;

}NODE;

typedef struct {

	NODE *top;

	int size;

}STACK;

void init(STACK *);
void push(STACK *, int);
void pop(STACK *);
void printAll(STACK *);
int getSize(STACK *);
int isEmpty(STACK *);
void top(STACK *);

int main(){

	STACK *s = (STACK *)malloc(sizeof(STACK));

	int n;
	char order[10];

	init(s);

	while(1){

		scanf("%s", order);

		if (strcmp(order, "push") == 0) {
			scanf("%d", &n);
			getchar();
			push(s, n);
		}
		else if (strcmp(order, "pop") == 0) {
			pop(s);
		}
		else if (strcmp(order, "size") == 0) {
			printf("size : %d\n", getSize(s));
		}
		else if (strcmp(order, "top") == 0) {
			top(s);
		}
		else if (strcmp(order, "print") == 0) {
			printAll(s);
		}
		else if (strcmp(order, "exit") == 0) {
			break;
		}

	}

	return 0;

}

void init(STACK *s) {
	s->top = NULL;
	s->size = 0;
}

void push(STACK *s, int n) {

	NODE *new_node = (NODE*)malloc(sizeof(NODE));

	new_node->n = n;
	new_node->next = s->top;

	s->top = new_node;

	s->size++;

	printf("Push Success\n");

}

void pop(STACK *s) {

	int result;
	NODE *tmp;

	if (isEmpty(s)) {
		printf("Stack Empty\n");
		return;
	}

	tmp = s->top;
	result = tmp->n;

	s->top = tmp->next;
	s->size--;

	free(tmp);

	printf("pop : %d\n", result);

}

void printAll(STACK *s) {

	NODE *i;

	i = s->top;

	if (i == NULL) {
		printf("Stack Empty\n");
		return;
	}

	while (i != NULL) {
		printf("%d\n", i->n);
		i = i->next;
	}

}

int getSize(STACK *s) {
	return s->size;
}

int isEmpty(STACK *s) {
	return s->top == NULL;
}

void top(STACK *s) {

	if (isEmpty(s)) {
		printf("Stack Empty\n");
		return;
	}

	printf("top : %d\n", s->top);

}


반응형

'알고리즘창고' 카테고리의 다른 글

[C] 보고 정렬 (bogo sort, stupid sort)  (0) 2018.07.13
[C] 버블 정렬 (bubble sort)  (0) 2018.07.12
[C] 배열 기반 스택 (array stack)  (0) 2018.07.10