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