C - 스택(Stack)

고현준·2020년 3월 2일
0

C

목록 보기
2/9
post-custom-banner

메모리 저장 방식 중 가장 일반적인 stack이다.
입력과 출력하는 구멍이 하나이므로 나중에 입력하는 것부터 출력할 수 있다. 입력을 push, 출력 및 출력항목을 배열에서 삭제는 pop, 출력만은 peek이다.

헤더 (IntStack.h)

#ifndef ___IntStack
#define ___IntStack

typedef stuct {
	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 InStack* 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

함수 (IntStack.c)

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

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

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;
    }
    
int Peek(const IntStack* s, int* x) {
	if(s->ptr <=0) 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) {
	int i;
    for(i = s->ptr-1; i>=0; i--) {
    	if(s->stk[i] == x)
        	return i;
        return -1;
    }
    
int 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;
    }
profile
박치기
post-custom-banner

0개의 댓글