ArrayStack을 이용하여 Stack에 데이터를 넣었다가 빼고, 스택에 존재하는지, 현재 스택 상태 출력 등에 대한 Function들을 작성해보았습니다.


(1) arraystackmain.c

#include <stdio.h>

#include <stdlib.h>

#include "arraystack.h"


int main(int argc, char* argv[]) {

char value = 0;

ArrayStack *pStack = NULL;

ArrayStackNode *pNode = NULL;

pStack = createArrayStack(6);


if (pStack != NULL) {

ArrayStackNode node1 = { 'A' };

ArrayStackNode node2 = { 'B' };

ArrayStackNode node3 = { 'C' };

ArrayStackNode node4 = { 'D' };

pushAS(pStack, node1);

pushAS(pStack, node2);

pushAS(pStack, node3);

pushAS(pStack, node4);

displayArrayStack(pStack);

pNode = popAS(pStack);

if (pNode != NULL) {

printf("Pop 값-[%c]\n", pNode->data);

free(pNode);

}

else {

printf("공백(Empty) 스택\n");

}

displayArrayStack(pStack);

pNode = peekAS(pStack);

if (pNode != NULL) {

printf("Peek 값 - [%c]\n", pNode->data);

}

else {

printf("공백(Empty) 스택\n");

}

displayArrayStack(pStack);

}

return 0;

}


(2) arraystack.c

#include <stdio.h>

#include <stdlib.h>

#include <string.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;

pReturn->currentElementCount = 0;

}

else {

printf("오류, 메모리 할당, createArrayStack()\n");

return NULL;

}

}

else {

printf("오류, 스택의 크기는 0이상이어야 합니다.\n");

return NULL;

}


pReturn->pElement = (ArrayStackNode *)malloc(sizeof(ArrayStackNode)*size);


return pReturn;

}


int pushAS(ArrayStack* pStack, ArrayStackNode element) {

int i = 0;

int ret = FALSE;

if (pStack != NULL) {

if (isArrayStackFull(pStack) == FALSE) {

pStack->pElement[pStack->currentElementCount] = element;

pStack->currentElementCount++;

ret = TRUE;

}

else {

printf("오류, 스택이 가득 찼습니다, pushAS()\n");

}

}

return ret;

}


ArrayStackNode* popAS(ArrayStack* pStack) {

ArrayStackNode* pReturn = NULL;

if (pStack != NULL) {

if (isArrayStackEmpty(pStack) == FALSE) {

pReturn = (ArrayStackNode *)malloc(sizeof(ArrayStackNode));

if (pReturn != NULL) {

*pReturn = pStack->pElement[pStack->currentElementCount - 1];

pStack->currentElementCount--;

}

else {

printf("오류, 메모리할당, popAS()\n");

}

}

}

return pReturn;

}


ArrayStackNode* peekAS(ArrayStack* pStack) {

ArrayStackNode* pReturn = NULL;

if (pStack != NULL) {

if (isArrayStackEmpty(pStack) == FALSE) {

pReturn = &(pStack->pElement[pStack->currentElementCount - 1]);

}

}

return pReturn;

}


void deleteArrayStack(ArrayStack* pStack) {

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;

}


void displayArrayStack(ArrayStack *pStack) {

int i = 0;

if (pStack != NULL) {

int size = pStack->maxElementCount;

int top = pStack->currentElementCount;

printf("스택 크기: %d, 현재 노드 개수: %d\n", pStack->maxElementCount, pStack->currentElementCount);

for (i = size - 1; i >= top; i--) {

printf("[%d]-[Empty]\n", i);

}

for (i = top - 1; i >= 0; i--) {

printf("[%d]-[%c]\n", i, pStack->pElement[i].data);

}

}

}


(3) arraystack.h

#ifndef _ARRAY_STACK_

#define _ARRAY_STACK_


typedef struct ArrayStackNodeType {

char data;

} ArrayStackNode;


typedef struct ArrayStackType {

int maxElementCount;

int currentElementCount;

ArrayStackNode *pElement;

} ArrayStack;


ArrayStack* createArrayStack(int size);

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);


#endif


#ifndef _COMMON_STACK_DEF_

#define _COMMON_STACK_DEF_


#define TRUE 1

#define FALSE 0


#endif

'Programming > C' 카테고리의 다른 글

(5) DoubleLinkedList 사용하기  (0) 2016.10.30
(4) Linkedlist 를 이용하여 Reverse, Concat 응용  (0) 2016.10.30
(3) Linkedlist 사용하기  (0) 2016.10.30
(1) ArrayList 사용하기  (0) 2016.10.30
C언어란?  (0) 2016.04.18

WRITTEN BY
SiriusJ

,