출처 : <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번지다. 그냥 편의상 저렇게 적은 것일 뿐.)
'C > 자료구조' 카테고리의 다른 글
문과생이 이해한 선형큐 (0) | 2021.05.19 |
---|---|
문과생이 이해한 스택(동적, 구조체) (0) | 2021.05.10 |
문과생이 이해한 이중 연결리스트 (0) | 2021.04.26 |
문과생이 이해한 원형 연결리스트 (0) | 2021.04.26 |
문과생이 이해한 단일 연결리스트(이중 포인터 사용) (0) | 2021.04.11 |