C로 Stack 만들기
C++에 이어 C로도 Stack을 만들어 보겠다.
우선 메인함수부터 만들어준다.
#include <stdio.h>
#include <malloc.h>
#include "stack.h"
main()
{
/*Stack a;
int x;
initialize(&a);
push(&a, 10);
push(&a, 20);
push(&a, 30);
x = pop(&a);
push(&a, 40);
printf("%d, %d\n", x, pop(&a));*/
Stack *a;
int x;
a = (Stack *)malloc(sizeof(Stack));
initialize(a);
push(a, 10);
push(a, 20);
push(a, 30);
x = pop(a);
push(a, 40);
printf("%d, %d\n", x, pop(a));
free(a);
}
주석 처리된 부분은 스택을 Automatic allocation으로 다루는 방식이며 메서드를 호출할때 주소값을 넘겨주는 call by reference(call by address)로 작업하는 방식이다.
주석 아래 위치한 Dynamic allocation 방식으로 스택을 만들어 보겠다. Stack *a를 만들어 Stack의 사이즈만큼 memory allocation을 해준다. 그리고 initialize 함수로 Stack을 초기화 시켜준다. push() 작업과 pop() 작업을 각각 해주고 print 해본다면 30, 40이 출력되어 나올것이다. 그리고 프로그램 종료시 free()를 통해 Garbage 값 Stack *a를 없애준다.
그 다음으로 Stack의 헤더 파일이다.
#define MAX (100)
typedef struct _stack {
int s[MAX];
int top;
} Stack;
extern void initialize(Stack *p);
extern void push(Stack *p, int x);
extern int pop(Stack *p);
스택으로 사용할 배열의 사이즈값을 MAX라는 이름으로 정의해준다. Stack 객체는 typedef struct 구조체 형식으로 정의한다. Stack 구조체 안에는 배열 s와 스택의 꼭대기를 가리킬 변수 top이 data member로써 들어간다.
Stack에서 사용할 함수들을 (extern+return type+함수이름) 형식으로 정의한다.
extern은 파일이 분리되어 있을때 전역 함수로써 사용하는 것이다.
마지막으로 Stack을 구현한 Stack.c를 보겠다.
#include "stack.h"
void initialize(Stack *p) {
int i;
p->top = -1;
for (i = 0; i < MAX; i++) p->s[i] = 0;
}
void push(Stack *p, int x) {
p->top = p->top + 1;
p->s[p->top] = x;
}
int pop(Stack *p) {
p->top = p->top - 1;
return p->s[p->top+1];
}
미리 만들어둔 Stack의 헤더파일을 include 시켜주고 각 함수들을 구체화시킨다. initialize는 parameter로 넘어온 Stack *p의 top을 -1로 세팅하고 배열을 0으로 초기화 시켜준다.
push와 pop은 각각 exception을 고려하지 않고 작업한다.
C로 Stack 짜는 걸 대략적으로 해보았다.
'Data Structure' 카테고리의 다른 글
C Circular Queue 만들기 (0) | 2023.03.14 |
---|---|
C++ Queue 만들기 (version.2 - Circular Queue) (0) | 2023.03.14 |
C++ Queue 만들기 (version.1) (0) | 2023.03.14 |
C++ Stack 만들기 (version.1) (0) | 2023.03.13 |
Data Structure - Graph Structure (0) | 2022.04.17 |
댓글