: 데이터를 일시적으로 저장하기위해 사용하는 자료구조(후입선출,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;
}