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