stack을 배운지 오래이다.

 여기서 생각한건 'int stack, char stack등 각 자료형을 따로 만드는건 귀찮지 않는가?' 라고 생각했었다.

 그래서 생각한건 void는 자료형을 저장하지 않는다는걸 이용하여 void_stack형을 제작할려고 한다.


 일단, void형의 stack과 자료형이 정의된 stack의 차이는 void형 자료형은 다른 자료형과 다르게, '자료형이 정의 되어있지 않는' 형태이다.

 자료형이 정의 되어 있지 않기 때문에, 자료형의 크기를 정의해줘야하며, 자료형의 크기는 최소 단위인 Byte단위로 처리된다고 생각해야된다.

 그래서 그냥 자료형의 stack 구조체는

1
2
3
4
5
struct stack{
 int size;
 int top;
 int *dats;
};
cs

이런 구조가 된다.

하지만, void형의 구조는 다음과 같이 자료형의 크기를 정의 해줘야된다.

1
2
3
4
5
6
struct _void_stack{
 int i_size;
 char v_size;
 int top;
 void *dats;
};
cs


이 구조를 나는 void_stack이라고 정의 하겠다.

나머지 void_stack에 쓰이는 함수들을 정의는 다음과 같이 할 것이다.

1
2
3
4
int mk_stack(struct _void_stack**,const int,const int);
int push_stack(struct _void_stack*,const void*);
int pop_stack(struct _void_stack*,void*);
int delete_stack(struct _void_stack**);
cs

다른 것과 차이는 mk_stack은 void_stack을 받아서 처리하도록 하고, 실패할시 1을 성공할시 0으로하여 문제점을 제거하는 방향으로 잡았다.

함수의 구현 소스

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
61
62
63
64
65
66
67
68
69
70
int mk_stack(struct _void_stack** stack,const int i_size,const int v_size){
 
    if(stack==NULL) return 1;//Input Stack is Not Values.
    if(*stack!=NULL) return 1;//Not NULL.
 
    *stack=(struct _void_stack*)malloc(sizeof(struct _void_stack));
 
    if(*stack==NULL) return 1;//Not Create Stack.
 
    (*stack)->i_size=i_size;
    (*stack)->v_size=v_size;
    (*stack)->top=-1;
    (*stack)->dats=NULL;
 
    (*stack)->dats=(void*)malloc(i_size*v_size);
    *(char*)(*stack)->dats=10;
 
    if((*stack)->dats==NULL)return 1;
 
    return 0;
 
}
 
int push_stack(struct _void_stack* stack,const void* dats){
 
    int n = 0;
 
    if(stack==NULL) return 1;//Stack is NULL.
    if(stack->top==stack->i_size) return 1;//Stack is FULL.
 
    stack->top++;
 
    for(n=0;n<stack->v_size;n++){
        *((char*)stack->dats+(stack->v_size*stack->top)+n)=*((char*)dats+n);
    }
 
    return 0;
 
}
 
int pop_stack(struct _void_stack* stack,void* buff){
 
    int n = 0;
 
    if(stack==NULL) return 1;//Stack is NULL.
    if(stack->top==-1return 1;//Stack is Empty.
 
    for(n=0;n<stack->v_size;n++){
        //(char)buff[n]=(char)stack->dats[(stack->v_size*stack->top)+n];
        *((char*)buff+n)=*((char*)stack->dats+(stack->v_size*stack->top)+n);
    }
 
    stack->top--;
 
    return 0;
}
 
int delete_stack(struct _void_stack** stack){
 
    if(stack==NULL) return 1;
    if(*stack==NULL) return 1;
 
    free((*stack)->dats);
    free(*stack);
 
    *stack=NULL;
 
    return 0;
}
 
cs

설명으로 mk_stack의 설명을 하자면,

stack을 받는 변수에 NULL을 넣을 경우 오류나도록 하였고,

stack이 존재할 경우에 오류나도록 하였다.

이 이유는,

1. 값을 넣었을때, 문제를 일으키는 경우를 확인하는 것이다.

2. stack을 올바르게 넣었다고 하더라도 stack이 존재한 상태는 메모리를 손실을 일으킬 수 있기 때문에, 그걸 막기 위하여 NULL인지 확인 하는것이다.

이 2가지는 항상 확인해야되는 것이기 때문에, mk_stack이나, 다른 함수들이 오류나는걸 막는걸 주로 한다.

stack에서 dats을 동적할당하여 만들어 내고, 크기는 i_size[인덱스 크기]와 v_size[변수 자료형 크기]의 합이야한다.


전체 소스

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
 
#include <stdlib.h>
 
struct _void_stack{
    int i_size;//index size
    int v_size;//value size
    int top;//top
    void* dats;//data
};
 
int mk_stack(struct _void_stack**,const int,const int);
int push_stack(struct _void_stack*,const void*);
int pop_stack(struct _void_stack*,void*);
int delete_stack(struct _void_stack**);
 
 
int mk_stack(struct _void_stack** stack,const int i_size,const int v_size){
 
    if(stack==NULL) return 1;//Input Stack is Not Values.
    if(*stack!=NULL) return 1;//Not NULL.
 
    *stack=(struct _void_stack*)malloc(sizeof(struct _void_stack));
 
    if(*stack==NULL) return 1;//Not Create Stack.
 
    (*stack)->i_size=i_size;
    (*stack)->v_size=v_size;
    (*stack)->top=-1;
    (*stack)->dats=NULL;
 
    (*stack)->dats=(void*)malloc(i_size*v_size);
 
    if((*stack)->dats==NULL)return 1;
 
    return 0;
 
}
 
int push_stack(struct _void_stack* stack,const void* dats){
 
    int n = 0;
 
    if(stack==NULL) return 1;//Stack is NULL.
    if(stack->top==stack->i_size) return 1;//Stack is FULL.
 
    stack->top++;
 
    for(n=0;n<stack->v_size;n++){
        *((char*)stack->dats+(stack->v_size*stack->top)+n)=*((char*)dats+n);
    }
 
    return 0;
 
}
 
int pop_stack(struct _void_stack* stack,void* buff){
 
    int n = 0;
 
    if(stack==NULL) return 1;//Stack is NULL.
    if(stack->top==-1return 1;//Stack is Empty.
 
    for(n=0;n<stack->v_size;n++){
        //(char)buff[n]=(char)stack->dats[(stack->v_size*stack->top)+n];
        *((char*)buff+n)=*((char*)stack->dats+(stack->v_size*stack->top)+n);
    }
 
    stack->top--;
 
    return 0;
}
 
int delete_stack(struct _void_stack** stack){
 
    if(stack==NULL) return 1;
    if(*stack==NULL) return 1;
 
    free((*stack)->dats);
    free(*stack);
 
    *stack=NULL;
 
    return 0;
}
 
 
cs

이렇게 제작하면, void_stack이 완성되게 된다.


Posted by JunkMam
,