반응형





- ListBaseStack.h -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#ifndef __LB_STACK_H__
#define __LB_STACK_H__
 
#define TRUE 1
#define FALSE 0
 
typedef int Data;
 
typedef struct _node // 연결 리스트의 노드를 표현한 구조체
{
    Data data;
    struct _node *next;
} Node;
 
typedef struct _listStack // 연결 리스트 기반 스택을 표현한 구조체
{
    Node *head;
} ListStack;
 
typedef ListStack Stack;
 
void StackInit(Stack *pstack); // 스택 초기화
int SIsEmpty(Stack *pstack); // 스택이 비어있는지 확인
 
void SPush(Stack *pstack, Data data); // 스택의 push 연산
Data SPop(Stack *pstack); // 스택의 pop 연산
Data SPeek(Stack *pstack); // 스택의 peek 연산
 
#endif
 
 
Crocus





- ListBaseStack.c -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>
#include <stdlib.h>
#include "ListBaseStack.h"
 
void StackInit(Stack *pstack) // 스택 초기화 과정
{
    pstack->head = NULL// 초기화 과정에서는 아무것도 가리키지 않는 NULL을 지정한다.
}
 
int SIsEmpty(Stack *pstack) // 스택이 비었는지 확인
{
    if (pstack->head == NULL// head포인터가 가리키는 부분이 아무것도 없다면 
        return TRUE; // 노드가 형성되어 있지 않은 상태 즉 스택이 비어있다는 뜻이다.
 
    else
        return FALSE;
}
 
void SPush(Stack *pstack, Data data) // 스택 노드에 값을 추가
{
    Node *newNode = (Node*)malloc(sizeof(Node)); // 노드에 공간을 형성해준다.
 
    newNode->data = data; // 새로 생긴 노드의 data부분에 data값을 넣어주고
    newNode->next = pstack->head; // 새로 생긴 노드의 next부분은 head가 가리키고 있던 노드를 가리킴
 
    pstack->head = newNode; // head는 새로 생긴 노드를 가리키게 한다.
}
 
Data SPop(Stack *pstack) // 스택의 값을 추출
{
    Data rdata;
    Node *rnode;
 
    if (SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    rdata = pstack->head->data; // rdata는 head가 가리키는 부분의 data가 가리키는 값을 가진다.
    rnode = pstack->head; // rnode는 head가 가리키는 부분을 가리킨다.
 
    pstack->head = pstack->head->next; // head는 head가 가리키는 부분의 next가 가리키는 부분을 가진다.
    free(rnode); // rnode가 가리키던 부분을 삭제한다. 즉 노드를 삭제한다.
 
    return rdata; // rdata의 값을 반환한다.
}
 
Data SPeek(Stack *pstack) // 스택 가장위에 있는 값을 보여주는 함수
{
    if (SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    return pstack->head->data;
}
 
 
Crocus





- ListBaseStackMain.c -


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
#include "ListBaseStack.h"
 
int main(void)
{
    // Stack의 생성 및 초기화
    Stack stack;
    StackInit(&stack);
 
    //데이터 넣기
    SPush(&stack1);
    SPush(&stack2);
    SPush(&stack3);
    SPush(&stack4);
    SPush(&stack5);
 
    //데이터 꺼내기
    while (!SIsEmpty(&stack))
        printf("%d ", SPop(&stack));
 
    return 0;
}
 
 
Crocus


반응형