본문 바로가기

C/자료구조

문과생이 이해한 스택(정적, 구조체)

728x90

출처 : <c언어로 쉽게 풀어쓴 자료구조> + 학교 수업

 

#include<stdio.h>
#include<stdlib.h>
#define MAX 100

typedef struct {
	int student_no;
	char name[MAX];
	char address[MAX];
}element;

element stack[MAX];
int top = -1;

int is_empty() {
	return top == -1;
}

int is_full() {
	return top == MAX - 1;
}

void push(element item) {
	if (is_full()) {
		fprintf(stderr, "스택 포화 에러\n");
		return;
	}
	else stack[++top] = item;
}

element pop() {
	if (is_empty()) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else return stack[top--];
}

element peek() {
	if (is_empty()) {
		fprintf(stderr, "스택 공백 에러\n");
		exit(1);
	}
	else return stack[top];
}

int main() {
	element ie = { 20190001, "Hong", "Seoul" };
	element oe;

	push(ie);
	oe = pop();

	printf("학번 : %d\n", oe.student_no);
	printf("이름 : %s\n", oe.name);
	printf("주소 : %s\n", oe.address);

	return 0;
}

 

 

 중간 고사 끝나고 현타 왔다가 다시 멘탈 부여잡고 쓴다. 근데 문과 복전생이라는 타이틀이 항상 따라 다녀서 혼자 열등감도 느끼고 초조해하고 힘들었는데. 이번 중간고사 성적 우수자 명단에 내 이름 들어있는 거 보고 눈물날 것 같았다. 심지어 공동 1등. 시험 볼 때 너무 긴장해서 손 덜덜 떨면서 본 게 엊그제 같은데. 

 

 교수님께서 갈 길이 먼 사람일수록 빨리 가려고 요령을 부리는데, 그럴수록 정석대로 해야 한다고 하셨다. 뭔가 그 말이 조금은 와닿는 느낌이다. 

 

 

 아무튼 스택부터 고. 

 

 

#main()

 일단 스택에 구조체를 넣을 수 있다는 거에서 1차 충격. 당연히 포인터로 하면 들어가긴 하겠지만 처음 봤을 때 대게 신박했다. 

 

 

 참고로 구조체와 stack은 이런 모양이다. 

 

 

#push()

 이제 구조체 ie를 스택에 넣을 시간이다. 

 

 일단 is_full()을 통해서 스택이 꽉 찼는지 검사한다. 여기서 스택에 관한 기본적인 개념을 짚고 가보겠다. 

 

 MAX가 8이라고 가정했을 때. top이 -1부터 시작하는 이유는 push연산을 할 때 stack[++top]=data 코드를 써주기 때문이다. 그니까 0번 인덱스부터 시작하려고!

 

 그러므로 스택이 공백일 때는 top==-1일 때.

 

 그리고 인덱스가 0번부터 시작하니까 top== MAX-1이 꽉 찬 상태가 된다. 

 

 

 자, 본론으로 돌아와서, 스택이 꽉찬 상태가 아니므로 else문을 실행한다. 

 main()문의 ie를 item으로 받았고, ie의 주소값을 10번지라고 가정하면. stack의 0번째 인덱스에 ie의 주소값인 10번지가 들어가게 된다. 

 

 

#pop()

 그리고 이제 pop을 해준다. 

 is_empty() 기억나는가? top==-1일 때! top은 현재 0이므로 else문을 실행하게 된다. pop()는 stack[0]을 반환하게 되는데 이는 oe에 들어가게 된다. 

 

 따란. (실제로 oe에 들어가는 것은 stack[0]에 있던 10번지다. 그냥 편의상 저렇게 적은 것일 뿐.)