티스토리 뷰

[소스 코딩]


■ ArrayBaseStack.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
#ifndef __AB_STACK_H__
#define __AB_STACK_H__
 
#define TRUE    1
#define FALSE    0
#define STACK_LEN    100
 
typedef int Data;                        // 사용자 정의 int형 Data 선언
 
typedef struct _arrayStack               // 사용자 정의 구조체 'ArrayStack' 정의
{
    Data stackArr[STACK_LEN];            // 100의 배열 구조를 갖는 스택 선언
    int topIndex;                        // 가장 위(마지막 데이터)를 가리키는 topIndex 선언
} ArrayStack;
 
typedef ArrayStack Stack;                // 'ArrayStack'이름을 Stack으로 변경
 
void StackInit(Stack * pstack);          // 스택을 초기화 하는 함수
int SIsEmpty(Stack * pstack);            // 스택에 데이터가 비어있는지 확인하는 함수
 
void SPush(Stack * pstack, Data data);   // 스택에 데이터를 삽입하는 함수
Data SPop(Stack * pstack);               // 스택에서 데이터를 추출하는 함수
Data SPeek(Stack * pstack);              // 스택의 데이터를 확인하는 함수
 
#endif
cs



■ 각 함수의 정의
// 스택을 초기화 하는 함수 //
void StackInit(Stack * pstack)
{
    pstack->topIndex = -1;
}
cs


- 데이터가 비어 있는 상태를 의미하기 위해 'topIndex를 -1'로 선언



// 스택에 데이터가 비어있는지 확인하는 함수 //
int SIsEmpty(Stack * pstack)
{
    if(pstack->topIndex == -1)
        return TRUE;
    else
        return FALSE;
}
cs


- '데이터가 비워져 있으면 TRUE'를 반환

- '데이터가 존재하면 FALSE'를 반환



// 스택에 데이터를 삽입하는 함수 //
void SPush(Stack * pstack, Data data)
{
    pstack->topIndex += 1;
    pstack->stackArr[pstack->topIndex] = data;
}
cs


- topIndex를 먼저 1 증가

  ※ 최초의 경우 배열 0번째를 지정


- 변경된 topIndex 위치에 입력 받은 데이터를 저장



// 스택에서 데이터를 추출하는 함수
Data SPop(Stack * pstack)
{
    int rIdx;
 
    if(SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    rIdx = pstack->topIndex;
    pstack->topIndex -= 1;
 
    return pstack->stackArr[rIdx];
}
cs


- 삭제할 데이터가 저장된 배열 인덱스를 저장하기 위한 'rIdx' 변수 선언

- 데이터가 비워져 있는 상태라면 "Stack Memory Error!"를 출력하고 함수 종료

- rIdx 변수에 현재 가리키는 topIndex를 저장

- 데이터가 삭제될 것이기 때문에 topIndex를 -1 감소

- 스택 배열의 rIdx 번째 인덱스를 반환



// 스택의 데이터를 확인하는 함수
Data SPeek(Stack * pstack)
{
    if(SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    return pstack->stackArr[pstack->topIndex];
}
cs


- 데이터가 비워져 있는 상태라면 "Stack Memory Error!"를 출력하고 함수 종료

- 스택 배열의 (마지막에 저장된) topIndex 값을 반환



■ ArrayBaseStack.c

#include <stdio.h>
#include <stdlib.h>
#include "ArrayBaseStack.h"
 
// 스택을 초기화 하는 함수 //
void StackInit(Stack * pstack)
{
    pstack->topIndex = -1;
}
 
// 스택에 데이터가 비어있는지 확인하는 함수 //
int SIsEmpty(Stack * pstack)
{
    if(pstack->topIndex == -1)
        return TRUE;
    else
        return FALSE;
}
 
// 스택에 데이터를 삽입하는 함수 //
void SPush(Stack * pstack, Data data)
{
    pstack->topIndex += 1;
    pstack->stackArr[pstack->topIndex] = data;
}
 
// 스택에서 데이터를 추출하는 함수
Data SPop(Stack * pstack)
{
    int rIdx;
 
    if(SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    rIdx = pstack->topIndex;
    pstack->topIndex -= 1;
 
    return pstack->stackArr[rIdx];
}
 
// 스택의 데이터를 확인하는 함수
Data SPeek(Stack * pstack)
{
    if(SIsEmpty(pstack))
    {
        printf("Stack Memory Error!");
        exit(-1);
    }
 
    return pstack->stackArr[pstack->topIndex];
}
cs



■ ArrayBaseStackMain.c

#include <stdio.h>
#include "ArrayBaseStack.h"
 
int main(void)
{
    // Stack의 생성 및 초기화 ///////
    Stack stack;
    StackInit(&stack);
 
    // 데이터 넣기 ///////
    SPush(&stack1);  SPush(&stack2);
    SPush(&stack3);  SPush(&stack4);
    SPush(&stack5);
 
    // 데이터 조회 ///////
    printf("마지막에 저장된 데이터: %d \n\n", SPeek(&stack));
 
    // 데이터 꺼내기 ///////
    printf("저장된 데이터 출력: ");
    while(!SIsEmpty(&stack))
        printf("%d ", SPop(&stack)); 
 
    return 0;
}
cs


- 데이터 삽입 순서(1 → 2 → 3 → 4 → 5)

- 마지막에 저장된 데이터 조회: SPeek(&stack) 함수 호출

- 저장된 데이터 출력: SIsEmpty 함수를 호출하여 반환된 값이 'TRUE가 아니면'(=FALSE) SPop 함수 호출 반복



■ 실행 결과


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함