데이터를 일시적으로 저장할 수 있는 스택
스택은 데이터를 일시적으로 저장하기 위한 자료구조로 가장 나중에 넣은 데이터를 가장 먼저 꺼냅니다.
데이터들을 푸시, 팝 할 때 위 사진상 노란색(3) 부분을 탑(top), 스택의 가장 밑바닥 부분을 바텀(boottom)이라고 합니다.
스택 구조체 intStack
스택을 관리하는 구조체로 IntStack은 3개의 멤버로 구성됩니다.
1. 스택으로 사용할 배열을 가리키는 포인터 stk
- 스택으로 푸시된 데이터를 저장할 용도의 배열을 가리키는 포인터입니다.
2. 스택의 최대 용량 max
- 스택의 최대 용량을 나타내는 멤버로 값은 배열 stk의 요소 개수와 같습니다.
3. 스택 포인터 prt
- 스택에 쌓여잇는 데이터의 개수를 나타내는 멤버이고, 스택 포인터라고 부릅니다.
스택이 비어있으면 ptr의 값은 0. 가득 차 있으면 max의 값과 같습니다. 가장 나중에 푸시된 tpo데이터는 stk입니다.
아래는 완성된 코드가 아닌 부분설명 코드입니다.
/*스택에 데이터를 푸시*/
int Push(IntStack *s, int x)
{
if(s->ptr >= s->max)/*스택이 가득 참*/
return -1;
s->stk[s->prt++]=x;
return 0;
}
/*스택에서 데이터를 팝*/
int Pop(IntStack &s, int *x)
{
if(s->ptr <=0) /*스택이 비어있음*/
return -1;
*x = s->stk[s->ptr--];
return 0;
}
/*스택에서 데이터를 피크*/
int Peek(const IntStack *s, int *x)
{
if(s->ptr <=0) /*스택 비어있음*/
return -1;
*x = s->stk[s->ptr -1];
return 0;
}
/*스택 비우기*/
void Clear(IntStack *s)
{
s->ptr = 0'
}
Push 함수는 스택에 데이터를 추가하는 함수로 스택이 다 차서 푸시할 수 없는 경우에는 -1을 반환합니다,
스택이 다 차지 않았다면 새로 추가할 데이터를 배열의 요소 stk에 저장하고 스택 포인터 ptk를 증가시킵니다.
마지막으로 푸시에 성공하면 0을 반환합니다.
아래처럼 스택이 가득 찼는지에 대한 검사는 관계 연산자(>=)가 아닌 등가 연산자(==)를 사용해도 됩니다.
if(s->ptr == s->max)
<종료함수 Terminate>
Terminate함수는 뒤처리를 담당하는 함수입니다.
Initialize 함수로 확보한 스택을 해제하고 용량 max와 스택 포인터 ptr의 값을 0으로 합니다.