티스토리 뷰


구현 소스

ArrayStack.h



#ifndef ARRAYSTACK_H
#define ARRAYSTACKT_H
#include <stdio.h>
#include <stdlib.h>

typedef int ElementType;

// 데이터를 가지는 Node 구조체 선언
typedef struct tagNode{
	
	ElementType Data;

}Node;

// 스택 구조체 선언

typedef struct tagArrayStack{
	int Capacity; // 배열로 구현하기 때문에 전체 용량을 제한함
	int Top;	  // 가장 최근에 들어온 데이터의 인덱스를 가지는 Top
	Node* Nodes;  // 데이터
}ArrayStack;

void AS_CreateStack(ArrayStack** Stack, int Capacity); // stack을 만드는 함수
void AS_DestroyStack(ArrayStack* Stack);			   // stack의 메모리를 해제하는 함수
void AS_Push(ArrayStack* Stack, ElementType Data);	   // stack의 Push 연산 수행
ElementType AS_Pop(ArrayStack* Stack);				   // stack의 Pop 연산 수행
ElementType AS_Top(ArrayStack* Stack);				   // stack의 최상위 데이터를 얻는 함수
int AS_GetSize(ArrayStack* Stack);					   // stack의 현재 데이터 개수를 얻는 함수
int AS_IsEmpty(ArrayStack* Stack);					   // stack이 비어있는 여부를 검사하는함수.

// 비타민 퀴즈 추가 함수 - 스택이 가득 차 있는지 체크하는 함수
int AS_IsFull(ArrayStack* Stack);

#endif

---------------------------------------------------------------------------------
ArrayStack.cpp
 

#include "ArrayStack.h"


// stack을 만드는 함수
void AS_CreateStack(ArrayStack** Stack, int Capacity){
	(*Stack) = (ArrayStack*) malloc(sizeof(ArrayStack));
	// ArrayStack 구조체 타입의 stack의 메모리를 할당하고
	
	(*Stack)->Nodes = (Node*) malloc(sizeof(Node) * Capacity);
	// stack의 맴버인 Nodes는 Node* 형 변수이므로 마찬가지로 Capacity만큼 메모리 할당

	(*Stack)->Capacity = Capacity; // stack의 용량 저장
	(*Stack)->Top	   = 0;		   // 초기생성시 top을 0으로 초기화 한다.
	

}
// stack의 메모리를 해제하는 함수
void AS_DestroyStack(ArrayStack* Stack){
	free(Stack->Nodes); // 먼저 Capacity에 따라 동적할당되는 Nodes의 메모리를 해제후
	free(Stack);		// Stack을 해제한다.
}
// stack의 Push 연산 수행 - 자체제작 예외처리 - 스텍이 가득 차 있는 경우 에러메시지 발생
void AS_Push(ArrayStack* Stack, ElementType Data){
	int Position = Stack->Top; 
	// Top은 삽입될 데이터의 인덱스를 가리키므로 (초기값0)

	if( !(AS_IsFull(Stack)) ){
		// Nodes[Stack->Top].Data 에 해당하는곳에 데이터 삽입
		Stack->Nodes[Position].Data =Data;
		// 데이터 저장이 끝나면 Top을 +1 증가 시킨다.
		printf("Data : %d is pushed  ||  ",Data);
		(Stack->Top)++;
	}
	else{
		printf("**** Error - Stack Is Full !! ****\n");
		return ;
	}
}
// stack의 Pop 연산 수행 - 추가 예외처리 - 스택이 비어있는 경우 에러메시지 발생
ElementType AS_Pop(ArrayStack* Stack){
	int Position;
	// Top은 삽입될 데이터의 인덱스를 가리키므로 -1 해줘야 현재 Top인 데이터의 인덱스를 얻을수 있다.
	// ex) Nodes[0]에 데이터가 저장되어있으면 현재의 Top은 1, 따라서 Nodes[0]의 데이터를 Pop시키기 위해선
	//     Nodes[Top-1]의 데이터를 찾으면 됨
	// Stack->Top의 값은 -1 되어 새로운 최상위 데이터값의 인덱스를 가리킬수 있게 한다.
	if(! (AS_IsEmpty(Stack)) ){
		Position = --(Stack->Top);
		printf("Data : %d is popped  ", Stack->Nodes[Position].Data);
		return Stack->Nodes[Position].Data;
	}
	else{
		printf("**** Error - Stack Is Empty ****\n");
		return 0;
	}
}
// stack의 최상위 데이터를 얻는 함수 - 추가 예외처리 - 스택이 비어있는 경우 에러메시지 발생
ElementType AS_Top(ArrayStack* Stack){
	int Position = Stack->Top-1;

	if(!AS_IsEmpty(Stack))
		return Stack->Nodes[Position].Data;
	// return Stack->Nodes[(Stack->Top)-1].Data;
	else{
		printf("**** Error - Stack Is Empty ****\n");
		return 0;
	}

}
 // stack의 현재 데이터 개수를 얻는 함수
int AS_GetSize(ArrayStack* Stack){
	return Stack->Top; // 데이터의 개수는 Top의 값과 같다.
}

// stack이 비어있는 여부를 검사하는함수.
int AS_IsEmpty(ArrayStack* Stack){
	return ( (Stack->Top)==0 );
	// Stack->Top이 0이라면 1, 아니면 0을 리턴
}

// 비타민 퀴즈 추가 함수 - 스택이 가득 차 있는지 체크하는 함수
int AS_IsFull(ArrayStack* Stack){
	return (Stack->Top) == (Stack->Capacity);
	// Top이 Capacity와 같으면 데이터가 가득 차 있다는 뜻과 같다.
}

---------------------------------------------------------------------------
main.cpp

#include "ArrayStack.h"


int main(){
	int i=0;
	ArrayStack* Stack = NULL;

	AS_CreateStack(&Stack,10); // Capacity가 10인 Stack 생성
	for(i=0;i<10;i++){
		AS_Push(Stack,i); 
		printf("Current Top : %d\n", Stack->Top);
	}// Push 연산 10회 수행
	AS_Push(Stack,i); // 용량이 초과됐을때의 예외 처리 확인

	for(i=0;i<10;i++){
		AS_Pop(Stack); 
		printf("Current Top : %d\n", Stack->Top);
	}// Pop 연산 10회 수행
	AS_Pop(Stack); // 비어있는 Stack에 Pop연산을 수행했을시 예외처리 확인

	AS_DestroyStack(Stack);
	return 0;
}

-----------------------------------------------------------------------------------
실행결과