본문 바로가기

✨스택✨

728x90
반응형
/*스택을 구현하는 구조체*/
typedef struct {
    int max; //스택용량
    int num; //스택에 쌓여있는 데이터의 개수(스택 포인터)
    char *stk;//스택의 첫 요소에 대한 포인터
}IntStack;

/*스택 초기화*/
void Initialisze(IntStack *stack,int max){
    stack->num = 0;
    stack->stk = malloc(max*sizeof(int));
    /*
    인자로 받은 스택 용량 만큼,
    인자로 받은 배열이 가리키는 스택의 첫 요소에 대한 포인터를 동적할당한다.
    */

    //동적할당 실패 시
    if((stack->stk)==NULL){stack->max = 0;return ;}

    //동적할당 성공 시
    stack->max = max;
    return ;
}

/*스택에 데이터를 푸시*/
void Push(IntStack *stack,char wrd){
    //stack의 top에 데이터를 추가한다. 
    //stack이 이미 꽉 차있으면 해당 데이터 는 스택에 저장하지 않고 “Stack FULL”을 출력한다.
    printf("Pushing....\n");

    if(IsFull(stack) == 1){
        puts("Stack FULL");
        return ;
    }
    printf(">>>stack->num = %d\n",stack->num);
    stack->stk[stack->num ++] = wrd;
    //인자로 받은 배열이 가리키는 배열의 num인덱스에 해당하는 공간에 데이터를 저장
    //이후 인덱스를 증가시킴
}

/*스택에 데이터를 팝 == 꺼냄*/
char Pop(IntStack *stack){
    //pop (stack) : stack의 top에 있는 데이터를 반환하고 stack에서 제거한다. 
    //stack이 비어 있 으면 “Stack Empty”를 출력한다.
    if(IsEmpty(stack) == 1) {
        puts("Stack Empty");
        return -1;
    }
    char del = stack->stk[stack->num --];
    //인자로 받은 배열이 가리키는 배열의 num 인덱스에 해당하는 데이터 값을 포인터 del의 참조값으로 저장
    //이후 인덱스를 감소하고 종료
    return del;
}

/*스택에서 데이터를 피크 == 확인*/
void Peek(IntStack *stack){
    //peek(stack): stack의 top에 있는 데이터를 화면에 출력한다. 
    //stack은 변화하지 않는다. stack이 비어 있으면 “Stack Empty”를 출력한다.
    if(IsEmpty(stack) == 1) {
        puts("Stack Empty");
        return ;
    }
    printf("%c\n",stack->stk[stack->num -1]);
    //인자로 받은 배열이 가리키는 배열의 (num-1) 인덱스에 해당하는 값을 포인터 pek의 참조값을 저장
}

/*스택의 모든 데이터 출력*/
void Print(IntStack *stack){
    for(int i=stack->num-1;i>=0;i--) printf("%c",stack->stk[i]);
    //스택의 데이터 수 만큼 반복하여 스택의 데이터를 출력
    printf("\n");
}

/*스택이 비어있는지의 유무*/
int IsEmpty(IntStack *stack){
    return (stack->num <= 0);
    //스택의 데이터 개수가 0보다 작거나 같으면 1
    //스택의 데이터 개수가 0보다 크면 0

    //스택이 비어있으면(데이터 개수가 0 이하) 1을 반환
}

/*스택이 가득 찼는지의 유무*/
int IsFull(IntStack *stack){
    return( stack-> num >= stack->max);
    //스택의 데이터 개수가 스택의 최대 용량보다 많으면 1 반환
    //스택의 데이터 개수가 스택의 최대 용량보다 적으면 0 반환
    //PUSH
}

int duplicate(IntStack *stack){
    //stack의 top에 있는 데이터를 pop해서 두 번 push 한다. 
    //stack이 이미 꽉 차있으면 “Stack FULL”을 출력한다.
    if(IsFull(stack) == 1){
        puts("Stack FULL");
        return -1;
    }
    Push(stack,Pop(stack));
    Push(stack,Pop(stack));

    return 0;
}

int Size(IntStack *stt){return (stt->num);}

void upRotate(IntStack *stack, int n){
    //stack의 맨 위 n 개의 데이터를 회전시킨다. 
    //단, n이 데이터의 개수보다 큰 경우에는 아무 작업을 하지 않는다.
    if( n <= Size(stack)) {
        int save = stack->stk[stack->num-1];
        for(int i=0;i<(n-1);i++){
            stack->stk[(stack->num-1) - i] = stack->stk[(stack->num-1) - i-1];
        }
        stack->stk[(stack->num-1) - (n-1)] = save;
        // printf(">>>");
        // Print(stack);
    }
}

void downRotate(IntStack *stack, int n){
    //stack의 맨 위 n 개의 데이터를 회전시킨다. 
    //단, n이 데이터의 개수보다 큰 경우에는 아무 작업을 하지 않는다.
    if( n <= Size(stack)){
        int save = stack->stk[0];
        for(int i=0;i<(n-1);i++){
            stack->stk[i] = stack->stk[i+1];
        }
        stack->stk[n-1] = save;//PUSH
    }
}

int main(){
}
728x90
반응형