[5]

ucf·2020년 10월 7일
0

알고리즘&자료구조

목록 보기
6/13

1. 스택

: 데이터를 일시적으로 저장하기위해 사용하는 자료구조(후입선출,LIFO)

IntStack.h(스택을 구현하기위해 사용할 함수들을 담은 헤더파일)

#ifndef ___IntStack //IntStack이 정의되있지않으면 endif까지의 코드를 실행
#define ___IntStack //IntStack을 정의

// 구조체 IntStack을 정의
typedef struct  {
        int max; // 스택의 최대용량
        int ptr; //스택 포인터(스택에 쌓여있는 데이터 개수를 나타냄)
        int *stk; // 스택으로 사용할 배열을 가르킴
} IntStack;

int Initialize(IntStack *s, int max); // 스택 초기화

int Push(IntStack *s, int x); // 스택 푸시

int Pop(IntStack *s, int *x); // 스택 팝

int Peek(const IntStack *s, int *x); // 스택 피크(맨 윗값 출력)

void Clear(IntStack *s); // 스택 비우기

int Capacity(const IntStack *s); //스택의 최대용량

int Size(const IntStack *s); // 스택의 데이터 개수

int IsEmpty(const IntStack *s); // 스택이 비어있는지 판단

int IsFull(const IntStack *s); // 스택이 가득찼는지 확인

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

void Print(const IntStack *s); // 스택의 모든데이터 출력

void Terminate(IntStack *s); // 스택 종료
#endif 

위의 헤더파일에서 전처리기를 이해하기위한 링크

https://blog.naver.com/PostView.nhn?blogId=clown7942&logNo=110123052710

IntStack.c(스택 함수의 기능을 담은 프로그램)

#include<stdio.h>
#include<stdlib.h>
#include "IntStack.h"

int Initialize(IntStack *s,int max){
        s->ptr = 0; // 스택의 데이터개수를 0으로 초기화
        // 배열생성에 실패하면
        if((s->stk = calloc(max,sizeof(int))) == NULL){
                s->max = 0; // 최대값을 0으로 초기화
                return -1; // 실패반환
        }
        s->max = max; // 최대값을 0으로 초기화
        return 0; // 성공 반환
}

int Push(IntStack *s, int x){
        if(s->ptr >= s->max) // 데이터 개수가 최대값 이상이면
                return -1; // 더이상 데이터를 넣을 수 없음
        s->stk[s->ptr++]=x; // stk[ptr]에 데이터 x를 넣고 ptr값 증감
        return 0;
}

int Pop(IntStack *s,int *x){ 
        if(s->ptr <= 0) // 데이터개수가 0 이하이면
                return -1; // 실패
        *x=s->stk[--s->ptr]; //ptr(데이터개수)값을 감소시키고 skt[ptr]값을 
        변수x에 저장, ptr의 값이 감소되므로 stk에서 값을 삭제하지않아도 
        다음 push때 데이터가 덮어씌어진다.
        
       	return 0;
}

int Peek(const IntStack *s, int *x){
        if(s->ptr <=0) // 데이터 개수가 0 이하이면 실패
                return -1;
        *x=s->stk[s->ptr-1]; // 스택의 맨 위의값을 변수 x에 저장
        return 0;
}

void Clear(IntStack *s){
        s->ptr = 0; // 데이터 개수 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; // 데이터개수가 0 이하인지 여부 리턴
}

int IsFull(const IntStack *s){
        return s->ptr >= s->max; // 데이터개수가 데이터 최대개수보다 크거나같은지 여부
}

// 스택에서 x값을 찾는 함수
int Search(const IntStack *s, int x){
        int i;
        for(i = s->ptr -1; i>=0; i--)
                if(s->stk[i]==x)
                        return i;
        return -1;
}

void Print(const IntStack *s){
        int i;
        for(i=0; i< s->ptr; i++)
                printf("%d",s->stk[i]);
        putchar('\n');
}

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

IntStackTest.c(메인 파일)

#include<stdio.h>
#include "IntStack.c"

int main(void){
        IntStack s;
        if(Initialize(&s,64) == -1){
                puts("make stack error!!");
                return 1;
        }

        while(1){
                int menu,x;
                printf("data su: %d / %d\n",Size(&s),Capacity(&s));
                printf("(1)push(2)pop(3)peek(4)print(0)exit : ");
                scanf("%d",&menu);

                if(menu == 0) break;
                switch(menu){
                case 1:
                        printf("data: ");
                        scanf("%d",&x);
                        if(Push(&s,x) == -1)
                                puts("error: push failed\n");
                        break;
                case 2:
                        if(Pop(&s,&x) == -1)
                                puts("error: pop failed\n");
                        else
                                printf("pop data is %d\n",x);
                        break;
                case 3:
                        if(Peek(&s,&x) == -1)
                                puts("error: peek failed\n");
                        else
                                printf("peek data is %d\n",x);
                        break;
                case 4:
                        Print(&s);
                        break;
                }
        }
        Terminate(&s);
        return 0;
}
        
       
profile
즐기자!

0개의 댓글