개념
- 선형 자료구조
- LIFO(Last-In-First-Out, 후입선출)
- 탑(top): 가장 최근에 스택에 삽입된 자료
연산
푸시(Push)
팝(Pop)
- 자료 제거
- 부족(Underflow) 현상 고려
피크(Peek)
구현
배열 리스트

- 최대 크기 지정
- 추가한 순서대로 배열에 삽입
👉 top은 currentElementCount -1
번째 노드
구조체와 함수 원형
typedef struct ArrayStackNodeType {
char data;
} ArrayStackNode;
typedef struct ArrayStackType {
int maxElementCount;
int currentElementCount;
ArrayStackNode *pElement;
} ArrayStack;
ArrayStack* createArrayStack(int maxElementCount);
int pushAS(ArrayStack* pStack, ArrayStackNode element);
ArrayStackNode* popAS(ArrayStack* pStack);
ArrayStackNode* peekAS(ArrayStack* pStack);
void deleteArrayStack(ArrayStack** pStack);
int isArrayStackFull(ArrayStack* pStack);
int isArrayStackEmpty(ArrayStack* pStack);
void displayArrayStack(ArrayStack* pStack);
create
ArrayStack* createArrayStack(int maxElementCount)
{
ArrayStack *stack;
if (maxElementCount < 0)
return (NULL);
stack = (ArrayStack*)malloc(sizeof(ArrayStack));
if (stack == NULL)
return (NULL);
stack->maxElementCount = maxElementCount;
stack->currentElementCount = 0;
stack->pElement = (ArrayStackNode*)malloc(sizeof(ArrayStackNode) * maxElementCount);
if (stack->pElement == NULL)
{
free(stack);
stack = NULL;
return (NULL);
}
return (stack);
}
push
int pushAS(ArrayStack* pStack, ArrayStackNode element)
{
if (pStack == NULL)
return (FALSE);
if (isArrayStackFull(pStack))
return (FALSE);
pStack->pElement[pStack->currentElementCount] = element;
pStack->currentElementCount++;
return (TRUE);
}
pop
ArrayStackNode* popAS(ArrayStack* pStack)
{
ArrayStackNode *new;
ArrayStackNode *element;
element = peekAS(pStack);
if (element == NULL)
return (NULL);
new = (ArrayStackNode *)malloc(sizeof(ArrayStackNode));
if (new == NULL)
return (NULL);
*new = *element;
pStack->currentElementCount--;
return (new);
}
peek
ArrayStackNode* peekAS(ArrayStack* pStack)
{
if (pStack == NULL)
return (NULL);
if (isArrayStackEmpty(pStack))
return (NULL);
return (&pStack->pElement[pStack->currentElementCount - 1]);
}
🔗 배열 리스트 스택 전체 코드
연결 리스트

- 최대 크기 지정 불필요
- 스택은 top 노드 포인터를 가지고, top은 이전 노드를 가리킴
제일 처음 push한 노드는 NULL을 가리킴
구조체와 함수 원형
typedef struct StackNodeType
{
char data;
struct StackNodeType* pLink;
} StackNode;
typedef struct LinkedStackType
{
int currentElementCount;
StackNode* pTopElement;
} LinkedStack;
LinkedStack* createLinkedStack();
int pushLS(LinkedStack* pStack, StackNode element);
StackNode* popLS(LinkedStack* pStack);
StackNode* peekLS(LinkedStack* pStack);
void deleteLinkedStack(LinkedStack** pStack);
int isLinkedStackEmpty(LinkedStack* pStack);
void displayLinkedStack(LinkedStack* pStack);
create
LinkedStack* createLinkedStack()
{
LinkedStack *stack;
stack = (LinkedStack *)malloc(sizeof(LinkedStack));
if (stack == NULL)
return (NULL);
stack->currentElementCount = 0;
stack->pTopElement = NULL;
return (stack);
}
push
int pushLS(LinkedStack* pStack, StackNode element)
{
StackNode *new;
StackNode *prev;
if (pStack == NULL)
return (FALSE);
new = (StackNode *)malloc(sizeof(StackNode));
if (new == NULL)
return (FALSE);
*new = element;
prev = peekLS(pStack);
new->pLink = prev;
pStack->pTopElement = new;
pStack->currentElementCount++;
return (TRUE);
}
pop
StackNode* popLS(LinkedStack* pStack)
{
StackNode *element;
element = peekLS(pStack);
if (element == NULL)
return (NULL);
if (pStack->currentElementCount == 1)
pStack->pTopElement = NULL;
else
pStack->pTopElement = element->pLink;
pStack->currentElementCount--;
return (element);
}
peek
StackNode* peekLS(LinkedStack* pStack)
{
if (pStack == NULL)
return (NULL);
if (isLinkedStackEmpty(pStack))
return (NULL);
return (pStack->pTopElement);
}
🔗 연결 리스트 스택 전체 코드