반응형
    
    
    
  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 |