나의 블로그에 정리한 Stack의 개념
=> gogo !!! 링크텍스트
#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 "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));
}
#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");
}