개인 서재..*/알고리즘

[C언어] 스택(feat.배열)

낭만붕어빵 2017. 4. 14. 20:24
반응형

1. ArrayStack.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
32
33
//스택 연산을 위한 함수원형 선언//
 
#ifndef ARRAYSTACK_H
#define ARRAYSTACK_H
 
#include <stdio.h>
#include <stdlib.h>
 
typedef int ElementType;
 
typedef struct tagNode{
    ElementType Data;
}Node;
 
typedef struct tagArrayStack{
    int Top;
    int Capacity;
    Node* Nodes;
}ArrayStack;
 
 
void AS_CreateStack(ArrayStack** Stack,int Capacity);//스택 생성
void AS_DestroyStack(ArrayStack* Stack);//스택 소멸
void AS_Push(ArrayStack* Stack,ElementType Data);//Push연산 수행
ElementType AS_Pop(ArrayStack* Stack);//Pop연산 수행
ElementType AS_Top(ArrayStack* Stack);//Top : 최상위 노드에 데이터만 반환
int AS_GetSize(ArrayStack* Stack);//크기 구하기
int AS_IsEmpty(ArrayStack* Stack);//스택이 비어있는지에 대한 유무 검사
int AS_IsFull(ArrayStack* Stack);//비타민퀴즈, 스택이 꽉 차있는지에 대한 유무
 
 
 
#endif
cs


2. ArrayStack.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
//스택 연산을 위한 함수 몸체 구현//
 
#include "ArrayStack.h"
 
void AS_CreateStack(ArrayStack** Stack,int Capacity){
    
    (*Stack)=(ArrayStack*)malloc(sizeof(ArrayStack));
 
    (*Stack)->Nodes=(Node*)malloc(sizeof(Node)*Capacity);
 
    (*Stack)->Top=0;
    (*Stack)->Capacity=Capacity;
}
 
void AS_DestroyStack(ArrayStack* Stack){
    free(Stack->Nodes);
    free(Stack);
}
 
void AS_Push(ArrayStack* Stack,ElementType Data){
    int Position=Stack->Top;
 
    Stack->Nodes[Position].Data=Data;
    Stack->Top++;
}
 
ElementType AS_Pop(ArrayStack* Stack){
    int Position=--(Stack->Top);
    return Stack->Nodes[Position].Data;
}
 
ElementType AS_Top(ArrayStack* Stack){
    int Position=Stack->Top-1;
    return Stack->Nodes[Position].Data;
}
 
int AS_GetSize(ArrayStack* Stack){
    return Stack->Top;
}
 
int AS_IsEmpty(ArrayStack* Stack){
    return (Stack->Top==0);
}
 
int AS_IsFull(ArrayStack* Stack){
    return ((Stack->Top)>=(Stack->Capacity));
}
 
cs


3. Test_ArrayStack.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
//테스트//
 
#include "ArrayStack.h"
 
int main(){
    int i=0,size;
    ArrayStack* Stack=NULL;
    
    scanf("%d",&size); //용량 입력받음
    AS_CreateStack(&Stack,size);
    
    while(! AS_IsFull(Stack)){
        scanf("%d",&i);
        AS_Push(Stack,i);
    }
    printf("스택이 다 찼습니더!\n");
    /*
    AS_Push(Stack,3);
    AS_Push(Stack,37);
    AS_Push(Stack,11);
    AS_Push(Stack,12); */
 
    printf("Capacity : %d, Size : %d, Top: %d\n",Stack->Capacity,AS_GetSize(Stack),AS_Top(Stack));
 
    for(i=0;i<size;i++){
        if(AS_IsEmpty(Stack)){
            break;
        }
 
        printf("Popped : %d\n",AS_Pop(Stack));
 
        if(! AS_IsEmpty(Stack))
            printf("Current Top: %d\n",AS_Top(Stack));
        else
            printf("Stack is Empty\n");
 
    }
 
    AS_DestroyStack(Stack);
 
    return 0;
}
 
cs


실행 결과



반응형