홍열
2012. 10. 27. 19:48
arraystack.cpp
arraystack.h
main.cpp
오늘은 배열로 구현한 Stack을 포스팅 하려고 합니다.
Stack : 자료를 한 방향으로만 쌓는 구조입니다. 앞에서 배운 리스트는 양방향으로 자료를 집어 넣고 , 뺄 수 있었지만 스택은 오직 한방향에서만 가능합니다.
스택에서는 오직 맨 위에다가만 자료를 추가할 수 있습니다. 이를 Push라고 합니다.
또한, 스택에서 자료를 꺼내는 것을 Pop라고 합니다.(현재 top에 있는 자료를 꺼내오겠죠!)
그래서 스택은 다른말로 LIFO(Last - In - First - Out) 맨 마지막에 들어와서 마지막 원소가 가장 먼저 나가는 특성을 지닙니다.
기본적으로 배열로 구현한 Stack에서는 크기를 지정해줘야 합니다.
배열로 구현한 스택의 단점은 크기를 미리 지정하고, 그 지정한 크기가 넘어가면 Overflow가 발생합니다.
arraystack.h
#ifndef _ARRAYSTACK_
#define _ARRAYSTACK_
typedef struct ArrayStackNodeType
{
int data;
}ArrayStackNode; //stackNode 구조체
typedef struct ArrayStackType
{
int maxElementCount; //최대 개수
int currentElementCount; //현재 개수
ArrayStackNode* pElement; //배열로 Node저장
}ArrayStack; //ArrayStack 구조체
ArrayStack* createArrayStack(int maxElementCount); //stack만드는 함수
int pushAS(ArrayStack* pStack, ArrayStackNode element); //push 함수
ArrayStackNode* popAS(ArrayStack* pStack); //pop 함수
ArrayStackNode* peekAS(ArrayStack* pStack); //현재 top에 있는 값 가져오는 함수
void deleteArrayStack(ArrayStack* pStack); //stack을 삭제하는 함수
int isArrayStackFull(ArrayStack* pStack); //stack이 full인지 검사
int isArrayStackEmpty(ArrayStack* pStack); //stack이 empty인지 검사
#endif
#ifndef _COMMON_STACK_DEF
#define _COMMON_STACK_DEF
#define TRUE 1
#define FALSE 0
#endif
arraystack.cpp
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include "arraystack.h"
ArrayStack* createArrayStack(int size)
{
ArrayStack* pReturn = NULL;
int i = 0;
if(size > 0)
{
pReturn = (ArrayStack*) malloc(sizeof(ArrayStack));
if(pReturn != NULL)
{
memset(pReturn , 0, sizeof(ArrayStack));
pReturn ->maxElementCount = size;
}
else
{
printf("pReturn memory malloc error\n");
return NULL;
}
pReturn->pElement = (ArrayStackNode*) malloc(sizeof(ArrayStackNode)*size);
if(pReturn->pElement != NULL)
{
memset(pReturn->pElement, 0, sizeof(ArrayStackNode)*size);
}
else
{
printf("pReturn memory malloc error\n");
free(pReturn);
return NULL;
}
}
else
{
printf("size is 0 over\n");
return NULL;
}
return pReturn;
}
int pushAS(ArrayStack* pStack, ArrayStackNode element)
{
int ret = FALSE;
int i;
if(isArrayStackFull(pStack))
{
printf("ArrayStack is full\n");
return ret;
}
if(pStack != NULL)
{
pStack->pElement[pStack->currentElementCount] = element;
pStack->currentElementCount++;
ret = TRUE;
}
return ret;
}
ArrayStackNode* popAS(ArrayStack* pStack)
{
ArrayStackNode* pReturn;
pReturn = (ArrayStackNode*) malloc(sizeof(ArrayStack));
if(isArrayStackEmpty(pStack))
{
printf("stack is empty\n");
return NULL;
}
pReturn = &(pStack->pElement[pStack->currentElementCount-1]);
pStack->currentElementCount--;
return pReturn;
}
ArrayStackNode* peekAS(ArrayStack* pStack)
{
ArrayStackNode* pReturn = NULL;
if(isArrayStackEmpty(pStack))
{
printf("stack is empty\n");
return NULL;
}
pReturn = (ArrayStackNode*) malloc(sizeof(ArrayStackNode));
pReturn = &(pStack->pElement[pStack->currentElementCount-1]);
return pReturn;
}
void deleteArrayStack(ArrayStack* pStack)
{
if(isArrayStackEmpty(pStack))
{
printf("stack is empty\n");
return ;
}
if(pStack!=NULL)
{
if(pStack->pElement != NULL)
{
free(pStack->pElement);
}
free(pStack);
}
}
int isArrayStackFull(ArrayStack* pStack)
{
int ret = FALSE;
if(pStack != NULL)
{
if(pStack->currentElementCount == pStack->maxElementCount)
ret =TRUE;
}
return ret;
}
int isArrayStackEmpty(ArrayStack* pStack)
{
int ret = FALSE;
if(pStack != NULL)
{
if(pStack->currentElementCount == 0)
ret =TRUE;
}
return ret;
}
main.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "arraystack.h"
void displayArrayStack(ArrayStack* pStack)
{
int i = 0;
if(pStack!=NULL)
{
int size = pStack->maxElementCount;
int top = pStack->currentElementCount;
printf("스택 크기 %d , 현재 노드 갯수 %d \n", size, top);
for(i = size - 1 ; i>=top; i--)
{
printf("[%d] - [empty]\n", i);
}
for(i = top - 1 ; i>=0; i--)
{
printf("location : [%d] - data : [%d]\n", i, pStack->pElement[i].data);
}
}
}
int main()
{
int i;
ArrayStack *stack = NULL;
ArrayStackNode node;
stack = createArrayStack(10);
for(i = 1; i<11; i++)
{
node.data = i;
pushAS(stack, node);
}
popAS(stack);
displayArrayStack(stack);
return 0;
}
main파일에 몇가지 함수를 실행 안해봤는데요. 기본적으로 실행은 다 됩니다.
제가 만든 소스도 같이 올립니다~
다음시간에는 연결리스트를 이용한 Stack를 만들께요~