카테고리 없음

데이터를 일시적으로 저장할 수 있는 스택

popal_kh 2023. 2. 3. 14:38

스택은 데이터를 일시적으로 저장하기 위한 자료구조로 가장 나중에 넣은 데이터를 가장 먼저 꺼냅니다.

데이터들을 푸시, 팝 할 때 위 사진상 노란색(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으로 합니다.