노트 / 자료구조와 알고리즘
큐와 스택: 먼저 온 것과 나중에 온 것
작업 대기열은 큐, 함수 호출은 스택입니다. 두 구조를 배열로 직접 구현하며 차이를 봅니다.
큐: 먼저 들어온 것이 먼저 나간다 (FIFO)
버튼 이벤트, 전송 대기 패킷, 명령 목록처럼 순서가 중요한 데이터는 큐에 쌓습니다. 링 버퍼가 바로 고정 크기 큐입니다. RTOS의 메시지 큐도 같은 원리에 잠금과 대기 기능을 더한 것입니다.
스택: 나중에 들어온 것이 먼저 나간다 (LIFO)
static int16_t st[16];
static uint8_t top;
void push(int16_t v) { if (top < 16) st[top++] = v; }
int16_t pop(void) { return top ? st[--top] : 0; }
CPU도 함수를 호출할 때 돌아갈 주소와 지역 변수를 스택에 쌓습니다. 가장 나중에 부른 함수가 가장 먼저 끝나기 때문입니다. 메뉴 화면에서 "뒤로 가기"를 구현할 때도 스택이 자연스럽습니다.
언제 무엇을
| 상황 | 구조 |
|---|---|
| 들어온 순서대로 처리 | 큐 |
| 되돌아가기, 중첩 구조 | 스택 |
| 가장 급한 것부터 | 우선순위 큐 |
임베디드에서는 둘 다 크기를 고정한 배열로 만들고, 넘칠 때 어떻게 할지(버림, 덮어쓰기, 에러 표시)를 처음부터 정해 둡니다.