diff --git a/stack.c b/stack.c
new file mode 100644
index 0000000000000000000000000000000000000000..b5eaae2fd16895bec5b44d2645314672db227ab4
--- /dev/null
+++ b/stack.c
@@ -0,0 +1,27 @@
+#include "stack.h"
+
+void stack_init(stack *s){
+    s->top = -1;
+    s->capacity = DEFAULT_CAPACITY;
+    s->data = malloc(sizeof(int) * DEFAULT_CAPACITY);
+}
+
+bool stack_is_empty(stack s){
+	return s.top == -1;
+}
+
+void stack_peek(stack s, int *value){
+    if (!stack_is_empty(s)) {
+        *value = s.data[s.top];
+    }
+}
+
+// depile
+void stack_pop(stack *s, int *val){
+	if (stack_is_empty(*s)){
+		return;
+	}
+	*val = s->data[s->top];
+	s->top -= 1;
+	printf("pop : %d, top : %d\n", s->data[s->top],s->top);
+}
diff --git a/stack.h b/stack.h
index 9796be5f47ab539a622deaa3bf8b563157b7c7ab..3d09d4b3fb3491648441339889178e01ffa15951 100644
--- a/stack.h
+++ b/stack.h
@@ -1,10 +1,19 @@
 #ifndef _STACK_H_
 #define _STACK_H_
 
+#include <stdio.h>
+#include <stdlib.h>
+#include "stdbool.h"
+
+#define DEFAULT_CAPACITY 4
+
 typedef struct _stack {
     int *data;
     int capacity;
     int top;
 } stack;
 
+void stack_init(stack *s);
+void stack_peek(stack s, int *value);
+
 #endif