스키마에듀 수업 0721

2023. 7. 21. 16:31스키마에듀 c언어 수업

728x90

 

// int형 stack
#include <stdio.h>
#include <stdlib.h>

typedef struct {

  int max;  //스택 용량
  int ptr;  //스택의 data 개수
  int *stk; //스택에 사용할 배열

} IntStack;

/*--- 스택 초기화 ---*/
int Initialize(IntStack *s, int max) {
  s->ptr = 0;
  if ((s->stk = (int*)calloc(max, sizeof(int))) == NULL){ //배열 생성 실패
      s->max = 0;
      return -1;
  }
    s->max = max;
    return 0;
}

/*--- 스택에서 데이터를 pop ---*/
int Push(IntStack *s, int x){

    if(s->ptr >= s->max)
        return -1;
    s->stk[s->ptr++] = x;
    return 0;
}

/*--- 스택에서 데이터를 제거 ---*/
int Pop(IntStack * s, int *x){
    if(s->ptr <= 0){ //스택이 비어있음.
        return -1;
    }

    *x = s->stk[--s->ptr];
    return 0;
}

/*--- 스택에서 데이터를 peek ---*/
int Peek(const IntStack *s, int *x){
    if(s->ptr <=0){   //stack이 비어있음.
        return -1;
    }
    *x = s->stk[s->ptr -1];
    return 0;
}

/*--- 스택의 모든 요소 삭제 ---*/
void Clear(IntStack *s){
    s->ptr = 0;
}

/*--- 스택의 최대 용량 ---*/
int Capacity(const IntStack *s){
    return s->max;
}

/*--- 스택의 데이터 개수 ---*/
int Size(const IntStack *s){
    return s->ptr;
}

/*--- 스택이 비어 있나요? ---*/
int IsEmpty(const IntStack *s){
    return s->ptr <=0 ;
}

/*--- 스택이 가득 찼나요? ---*/
int IsFull(const IntStack *s){
    return s->ptr >= s->max;
}

/*--- 스택에서 검색 ---*/
int Search(const IntStack *s, int x){ 

    for(int i= s->ptr -1 ; i>=0; i--){ //꼭대기(top) -> 바닥(bottom)으로 선형 검색
        if(s->stk[i] == x)
            return i;    //검색 성공
    }
    return -1;            //검색 실패
}

/*--- 모든 데이터 출력 ---*/
void Print(const IntStack *s){
    int i;
    for(int i=0; i< s->ptr; i++){  //bottom -> top
        printf("%d  ", s->stk[i]);
    }
    printf("\n");
}

/*--- 스택 종료 ---*/
void Terminate(IntStack *s){
    if(s->stk != NULL){
        free(s->stk);
    }
    s->max = s->ptr = 0;
}

int main(void){

    IntStack s;
    if(Initialize(&s, 64) == -1){
        puts("스택 생성에 실패했습니다.");
        return 1;
    }

    while(1){
        int menu, x;
        printf("현재 데이터 수 : %d / %d \n", Size(&s), Capacity(&s));
        printf("(1)푸시 (2)팝 (3)피크 (4)출력 (0)종료: ");
        scanf("%d", &menu);

        if(menu == 0)break;

        switch(menu){
            case 1:
                printf("데이터 : ");
                scanf("%d", &x);
                if(Push(&s, x) == -1)
                    puts("오류 : 푸시에 실패했습니다.");
                break;

            case 2:
                if(Pop(&s, &x) == -1){
                    puts("오류 : 팝에 실패했습니다.");
                }else
                    printf("팝 데이터는 %d입니다.\n", x);
                break;

            case 3:
                if(Peek(&s, &x) == -1){
                    puts("오류 : 피크에 실패했습니다.");
                }else
                    printf("피크 데이터는 %d입니다.\n", x);
                break;

            case 4: //출력
                Print(&s);
                break;
        }

    }

    Terminate(&s);
        return 0;

    return 0;
}

04스택과큐.pdf
16.07MB

https://www.acmicpc.net/problem/23305

 

23305번: 수강변경

$1$번 학생과 $5$번 학생이 수업을 교환하고, $2$번 학생과 $4$번 학생이 수업을 교환하면 $3$번 학생을 제외한 모든 학생이 원하는 수업을 수강할 수 있다.

www.acmicpc.net

 

https://www.acmicpc.net/problem/21313

 

21313번: 문어

문어에게 여덟개의 팔이 있다는 사실은 잘 알려져 있다. 하지만 문어들이 자신의 팔들을 1번, 2번, 3번, ..., 8번이라고 부른다는 말은 오늘 처음 들었을 것이다! 단, 시계방향으로 오름차순이라던

www.acmicpc.net