자료구조(1) 복습 프로젝트 - Stack 구현

채재헌·2022년 7월 27일
0
post-thumbnail

🎈 목차

1). Stack이란 무엇인가??(간단한 구조 &개념)

2). Stack 구현 설명 - "Stack.h"

3). Stack 구현 설명 - "Stack.c"

4). Stack 구현 설명 - "Stack main.c"

🎆 1). Stack이란 무엇인가??(간단한 구조 &개념)

1. Stack이란 ??

나의 블로그에 정리한 Stack의 개념
=> gogo !!! 링크텍스트


🎇 2). Stack 구현 설명 - "Stack.h"

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <crtdbg.h>

typedef int element;

typedef struct node		/*노드 구조체*/
{
	element data;		/*데이터 영역 :element(int 형) 데이터 저장*/
	struct node* next;	/*포인터 영역*/
} NODE;
typedef struct stack	/*스택 관리 구조체*/
{
	NODE* begin;		/*begin pointer(begin node 가리킴) */
	size_t size;		/*연결 리스트의 크기 - 실제 data node의 개수*/
} STACK;

void s_construct(STACK**);	/*스택 초기화*/
void s_destruct(STACK**);	/*스택 소멸자 */

bool s_empty(STACK*);		/*스택이 비었는지 확인*/
size_t s_size(STACK*);		/*스택 size 보이도록 나타냄*/

void s_push(STACK*, element);	/*스택에 원소 삽입*/
element s_pop(STACK*);			/*스택에 원소 삭제*/
element s_top(STACK*);			/*스택의 맨위를 스캔*/
void s_clear(STACK*);			/*스택을 초기화*/

  • <stdio.h>=>Standard Input/Output library (표준입출력 라이브러리),
  • <stdlib.h>=>stdlib.h는 C 언어의 표준 라이브러리로, 문자열 변환, 사 난수 생성, 동적 메모리 관리 등의 함수들을 포함하고 있다.
  • <stdbool.h> => standard boolean이라는 뜻으로 ,표준 Bool형을 정의하기 위한 헤더파일이다.
  • <string.h>=>문자열 처리를 위한 헤더 파일
  • <crtdbg.h>=>메모리 누수 탐지 기능을 탑재한 헤더 파일로 프로그램의 malloc이나 free와 같은 메모리 할당 해제가 여기에 정의된 함수를 이용하여 메모리를 추적 할 수 있다.

**그리고 타입 재정의 개념 링크 => Go Go
//https://sciphy.tistory.com/893

** 😎 => 스택의 include 한것은 그전 Linkedlist의 헤더 파일과 동일하며, 노드 구조체와 Stack구조체와 각 함수들은 약간 다르다(주석 참고)


✨ 3). Stack 구현 설명 - "Stack.c"

#include "stack.h"

/*-----------------------------------------------------------------------------------------
//Function name	: s_construct - 스택 생성 및 초기화
//Parameters		: *stack - *stack 구조체의 주소
//------------------------------------------------------------------------------------------*/
void s_construct(STACK** stack)
{
	*stack = (STACK*)malloc(sizeof(STACK));				/*stack 생성 */

	if (*stack != NULL)									/*스택 생성이 성공 될 경우*/
	{
		(*stack)->begin = (NODE*)malloc(sizeof(NODE));	/*스택 begin을 동적 할당(생성) */
		(*stack)->size = 0;								/*size=0으로 초기화*/

		if ((*stack)->begin != NULL)					/*스택의 begin의 생성이 성공된다면*/
		{
			(*stack)->begin->next = (NODE*)malloc(sizeof(NODE));	/*스택 begin->next를 동적할당(생성)*/
			(*stack)->begin->data = 0;								/*스택 begin의 데이터를 0으로 초기화 */

			if ((*stack)->begin->next != NULL)						/*스택 begin->next의 생성이 성공될경우*/
			{
				(*stack)->begin->next->next = NULL;					/*스택 begin->next->next의 값을 NULL로 초기화*/
			}
		}
	}
}

/*-----------------------------------------------------------------------------------------
//Function name	: s_destruct - 스택 소멸자
//Parameters		: *stack - *stack 구조체의 주소
//------------------------------------------------------------------------------------------*/
void s_destruct(STACK** stack)
{
	if (*stack != NULL)			/*스택 생성에 성공하였으면*/
	{
		for (NODE* now = (*stack)->begin; now != NULL; free((*stack)->begin)) /*스택 begin 을 가리키는 now의 값이 NULL이 될때까지 free 시켜줌*/
		{
			(*stack)->begin = now;		
			now = now->next;		// now 다음 노드위치로 이동
		}

		free(*stack);				/*stack free 시켜주기*/
		*stack = NULL;				/*stack  NULL로 초기화 시켜주기*/
	}
}

/*-----------------------------------------------------------------------------------------
//Function name	: s_empty - 스택이 비었는지 확인 
//Parameters	: stack- stack 구조체의 주소
//Return		: stack->size =0	
//------------------------------------------------------------------------------------------*/
bool s_empty(STACK* stack)
{
	return stack->size == 0;		// stack->size를 0으로 리턴
}

/*-----------------------------------------------------------------------------------------
//Function name	: s_size - 스택의 size 확인 
//Parameters	: stack - stack 관리 구조체의 주소
//Return		: stack->size 	
//------------------------------------------------------------------------------------------*/
size_t s_size(STACK* stack)
{
	return stack->size;		/*stack->size 리턴*/
}
/*-----------------------------------------------------------------------------------------
//Function name	: s_push - 스택에 원소 삽입 
//Parameters	: stack - stack 관리 구조체의 주소
				: data - 원소의 데이터	
//------------------------------------------------------------------------------------------*/
void s_push(STACK* stack, element data)
{
	NODE* node = (NODE*)malloc(sizeof(NODE));		/*새로운 노드 생성*/

	if (node != NULL)								/*노드 생성 성공시*/
	{
		node->data = data;							/*node의 데이터를 삽입 */

		node->next = stack->begin->next;			/*node의 다음을 가리키는 것을 기존의 stack-> begin->next가 가리키는곳으로 지정해준다*/
		stack->begin->next = node;					/*stack->begin ->next를 새로 생성된 노드를 가리키게 함*/
	}

	stack->size++;									/*stack->size를 증가시킴*/
}

/*-----------------------------------------------------------------------------------------
//Function name	: s_pop - 스택의 맨위에서 데이터 반환
//Parameters	: stack - stack 관리 구조체의 주소
// Return		: -result 반환 
				  -0 반환
//------------------------------------------------------------------------------------------*/
element s_pop(STACK* stack)
{
	if (!s_empty(stack))									/*stack이 안 비웠으면 */
	{
		NODE* temp = stack->begin->next->next;				/*temp는 begin의 다음 다음을 가르킴*/

		element result = stack->begin->next->data;			/*stack begin의 다음 노드 데이터를 result로 옮김 */

		free(stack->begin->next);							/*stack->begin 다음 노드를 free 시킴*/

		stack->begin->next = temp;							/*temp는 begin의 다음 노드를 가리키도록 함*/

		stack->size--;										/*stack->size 감소 */

		return result;										/*result 반환*/
	}

	return 0;												/* 0 반환 */
}

/*-----------------------------------------------------------------------------------------
//Function name	: s_top - 스택의 맨위를 스캔
//Parameters	: stack - stack 관리 구조체의 주소
//Return		: stack->begin->next->data	
//------------------------------------------------------------------------------------------*/
element s_top(STACK* stack)
{
	return stack->begin->next->data;//stack->begin 다음 노드의 데이터를 반환 
}

/*-----------------------------------------------------------------------------------------
//Function name	: q_construct - 스택을 초기화 
//Parameters		: stack - stack
//------------------------------------------------------------------------------------------*/
void s_clear(STACK* stack)
{
	for (; !s_empty(stack); s_pop(stack));
}

=> 위의 파일은 주석에 설명이 포함 되어 있음.


🎉 4). Stack 구현 설명 - "Stack main.c"

#include "stack.h"
#include "stack.c"
void stack_test()
{
	STACK* stack = NULL;

	s_construct(&stack);

	s_push(stack, 1);
	s_push(stack, 2);
	s_push(stack, 3);
	s_push(stack, 4);

	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_top(stack));

	s_push(stack, 1);
	s_push(stack, 2);
	s_push(stack, 3);
	s_push(stack, 4);

	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));
	printf("%d\n", s_pop(stack));

	s_destruct(&stack);

	printf("\n\nCHECK\n\n");
}

😊=>일단 메인함수는 간단한 구현과 테스트를 하기 해서 작성했으며,단순하게 동작하는 것을 확인해본다.(참조 : 날마다 테스트하는데 main 함수가 달라져서 제일 마지막에 확인 한것만 올리겠습니다)

0개의 댓글