Cmain.c · 68 行#include <stdio.h>#include <stdlib.h>#include <string.h> /* 직접 만든 늘어나는 배열: data는 cap칸을 빌려 두고, 앞의 size칸만 쓴다 */typedef struct { int *data; int size, cap; int grow, shrink;} IntVec; /* 칸 수를 newcap으로 바꾼다. realloc은 자리를 옮길 수 있어서 돌려받은 포인터를 쓴다 */static void resize(IntVec *v, int newcap) { int *p = realloc(v->data, (size_t)newcap * sizeof *p); if (p == NULL) { /* 실패하면 옛 블록은 그대로 남아 있다 */ free(v->data); exit(1); } v->data = p; v->cap = newcap;} static void push(IntVec *v, int x) { if (v->size == v->cap) { /* 가득 찼으면 두 배로: 옮겨 담기가 드물어진다 */ resize(v, v->cap * 2); v->grow++; } v->data[v->size++] = x;} /* 빈 배열이면 0, 아니면 *out에 마지막 값을 꺼내고 1 */static int pop(IntVec *v, int *out) { if (v->size == 0) return 0; *out = v->data[--v->size]; if (v->cap > 1 && v->size * 4 <= v->cap) { /* 1/4 이하로 줄면 반으로 */ resize(v, v->cap / 2); v->shrink++; } return 1;} int main(void) { IntVec v = { NULL, 0, 0, 0, 0 }; resize(&v, 1); /* 처음에 한 칸 빌려 둔다 */ int q; scanf("%d", &q); for (int i = 0; i < q; i++) { char cmd[8]; int x; scanf("%7s", cmd); if (strcmp(cmd, "push") == 0) { scanf("%d", &x); push(&v, x); } else if (strcmp(cmd, "pop") == 0) { if (pop(&v, &x)) printf("%d\n", x); else puts("empty"); } else if (strcmp(cmd, "get") == 0) { scanf("%d", &x); if (x < v.size) printf("%d\n", v.data[x]); else puts("out of range"); } else { printf("%d %d\n", v.size, v.cap); } } printf("grow %d shrink %d\n", v.grow, v.shrink); free(v.data); /* 빌린 블록은 마지막에 한 번 돌려준다 */ return 0;}