#include <stdio.h>
#include <stdlib.h>
#define MAX_STACK_SIZE 5
typedef struct {
int key;
} element;
// element 구조체를 저장할 수 있는 stack이라는 배열을 MAX_STACK_SIZE개 크기로 만듦
element stack[MAX_STACK_SIZE];
int top = -1;
void stackFull();
void stackEmpty();
// push()
// top 증가
// ↓
// 새 위치 결정
// ↓
// item 삽입
// pop()
// 현재 top 데이터 꺼냄
// ↓
// 반환
// ↓
// top 감소
// pop()은 배열 안의 값을 실제로 지우는 것이 아니라,
// top을 감소시켜 그 값을 "스택에서 더 이상 사용하지 않는 값"으로 만드는 것
// push는 밖에 있는 데이터를 스택 안으로 "넣는" 함수라서 입력값(item)이 필요, 반환할 것은 없음
void push(element item)
{
if(top >= MAX_STACK_SIZE-1)
{
stackFull();
}
stack[++top] = item;
// top증가 -> item 삽입 , top의 증가된 값을 바로 stack 배열의 인덱스로 사용
// top = top + 1;
// stack[top] = item; 이거의 줄임임
}
// pop은 스택 안에 있는 데이터를 밖으로 "꺼내 주는" 함수라서 입력값은 필요 없음,
// 그리고 꺼낸 데이터를 반환해야 함,스택에서는 가장 위에 값을 꺼냄. 즉 어떤 데이터를 꺼낼지 사용자가 선택하지 않음. 이미 알고 있기 때문
// 그래서 매개변수가 필요하지 않음
// 반환형이 element여야 데이터를 함수 밖으로 전달할 수 있음.
element pop()
{
if(top ==-1)
{
stackEmpty();
}
return stack[top--]; //item제거 -> top감소 (top은 항상 가장 먼저 삭제될 데이터를 가르켜야함=가장 마지막에 삽입된 데이터를 가르킴)
}
void stackFull()
{
fprintf(stderr, "Stack is full, cannnot add element");
// fprintf: 어디에 출력할 것인지를 직접 지정할 수 있는 함수
// stderr: 표준 오류 출력
exit(EXIT_FAILURE); // 프로그램 전체를 비정상 종료
}
void stackEmpty()
{
fprintf(stderr, "Stack is empty\n");
exit(EXIT_FAILURE);
}
int main() {
element item1 = {10}; //element item1 = {10}; → 변수를 만들면서 초기화
// element item1; 2줄과 위의 한줄은 동일한 뜻
// item1.key = 10;
element item2 = {20};
element item3 = {30};
element result;
/* Push */
push(item1);
printf("push : %d, top = %d\n", stack[top].key, top);
push(item2);
printf("push : %d, top = %d\n", stack[top].key, top);
push(item3);
printf("push : %d, top = %d\n", stack[top].key, top);
/* Pop */
result = pop();
printf("pop : %d, top = %d\n", result.key, top);
result = pop();
printf("pop : %d, top = %d\n", result.key, top);
result = pop();
printf("pop : %d, top = %d\n", result.key, top);
return 0;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: