Demo entry 6747852

a

   

Submitted by anonymous on Jun 06, 2018 at 16:37
Language: C++. Code size: 2.8 kB.

#include <stdio.h>
#include <stdlib.h>		// exit()의 사용을 위해
#include <malloc.h>

typedef int element;
// 스택에서 사용할 item은 경우에 따라 int, char 등등 다양한 자료형으로 쓰일 수 있다.
// 때문에 typedef를 통해 사용하게될 자료형을 element로 이름을 재정의 하였고, 이로써 유지보수에 능하도록 한다.

typedef struct StackNode {		// 노드는 값이 들어가는 item, 다음 노드를 가리키는 link로 이루어져 있다.
	element item;
	struct StackNode *link;	// StackNode 타입의 구조체를 가리키는 포인터 변수 link
}StackNode;

typedef struct LinkedStackType {	// 하위 요소가 top 하나 뿐이지만 일관성을 위해 구조체로 선언하여 사용한다.
	StackNode *top;			// top은 항상 스택의 첫번째 노드를 가리킨다.
					// 때문에, 나아가 스택의 모든 함수는 이 구조체를 매개변수로 받는다.
}LinkedStackType;

void init(LinkedStackType *s);			// 초기화
int is_empty(LinkedStackType *s);		// 스택이 비어있는지 판별
void push(LinkedStackType *s, element item);	// 스택에 item 추가
element pop(LinkedStackType *s);		// 스택의 최상위 노드의 item을 return하고 노드 삭제
element peek(LinkedStackType *s);		// 스택의 최상위 노드를 삭제하지 않고 item return


/////////////////////////////////////////////
void main(void) {

	LinkedStackType s;
	init(&s);
	push(&s, 1);
	push(&s, 2);
	push(&s, 3);

	while (!is_empty(&s)) {		// 스택이 모두 빌 때까지 반복한다.
		printf("%d\n", pop(&s));	// 1, 2, 3 순서로 push 했으므로 3, 2, 1 순서로 pop 및 출력된다.
	}
}
/////////////////////////////////////////////


void init(LinkedStackType *s) {
	s->top = NULL;			// top에 NULL을 대입함으로써 스택을 모두 초기화한다.
}

int is_empty(LinkedStackType *s) {
	return (s->top == NULL);	// top이 NULL일 경우 빈 스택이다.
	// 빈 스택일 경우 1(true)을 return, 그렇지 않을 경우 0(false)를 return 한다.
}

void push(LinkedStackType *s, element item) {
	StackNode *temp = (StackNode *)malloc(sizeof(StackNode));
	// 삽입할 노드 temp에 StackNode의 크기만큼 공간을 할당한다.
	// 이때 malloc 함수의 (void *)형 return 값을 (StackNode *)로 형변환을 해준다.
	// 다만 이는 C++의 Type Casting에 따른 것이며, 실제로 C에서는 이러한 형변환이 불필요하다.

	if (temp == NULL) {				// 메모리를 할당하는 과정에서 일어날 수 있는 예외 처리
		fprintf(stderr, "메모리 할당 에러\n");	// stderr 스트림을 통해 버퍼 없이 즉시 출력한다.
		return;					// 이 경우 어떤 상황에서도 가장 빠르게 에러를 출력할 수 있다.
	}
	else {
		temp->item = item;	// 삽입할 노드 temp의 item에 매개변수 item을 대입
		temp->link = s->top;	// 삽입할 노드 temp의 link가 최상위 노드를 가리키도록 함
		s->top = temp;		// 헤드포인터 top이 temp를 가리키도록 함
					// 이로써 최상위 노드는 temp가 되고, 기존 최상위 노드는 temp의 link가 가리키게 됨
	}
}

element pop(LinkedStackType *s) {
	if (is_empty(s)) {		// 스택이 비어있을 경우
		fprintf(stderr, "스택이 비어있습니다.\n");
		exit(1);		// 프로그램을 즉시 종료한다.
	}
	else {
		StackNode *temp = s->top;	// 삭제하게 될 노드 temp
		element item = temp->item;	// 삭제될 노드의 item을 미리 다른 곳에 저장한다.
		s->top = temp->link;		// temp->link 를 s->top->link로 대체 가능하다.
		free(temp);			// temp를 할당 해제, 즉 노드를 삭제한다.
		return item;			// pop한 item를 return한다.
	}
}

element peek(LinkedStackType *s) {
	if (is_empty(s)) {	// 스택이 비어있을 경우
		fprintf(stderr, "스택이 비어있습니다.\n");
		exit(1);	// 프로그램 즉시 종료
	}

	else {
		return s->top->item;	// pop과 달리 최상위노드를 삭제하지 않고 노드의 item만 return 한다.
	}
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).