Stacks, Queues, verkettete Listen und abstrakte Datentypen
스택, 큐, 연결 리스트, 추상 자료형
중요한 독일어·영어 용어는 유지하되 설명과 학습 동선은 한국어 중심으로 제공합니다.
이 챕터의 문항별 독립 학습 페이지
단원 페이지에는 개요와 학습 순서만 둡니다. 각 문항의 용어·비유·수식·단계별 풀이·실제 채점은 아래 독립 페이지에서 이어집니다.
I-2 · 1개 선택
스택과 큐에 대한 진술 중 정확히 하나를 고르시오.
독립 개념 강의와 실제 채점 열기 →I-3 · 1개 선택
연결 리스트에 대한 진술 중 정확히 하나를 고르시오.
독립 개념 강의와 실제 채점 열기 →II-3 · 2개 선택
스택과 큐에 대한 진술 중 정확히 두 개를 고르시오.
독립 개념 강의와 실제 채점 열기 →II-4 · 2개 선택
자료구조에 대한 진술 중 정확히 두 개를 고르시오.
독립 개념 강의와 실제 채점 열기 →
30초 핵심 요약
스택(Stack)은 LIFO이므로 마지막에 넣은(push) 원소가 먼저 빠진다(pop). 큐(Queue)는 FIFO이므로 먼저 넣은(enqueue) 원소가 먼저 빠진다(dequeue). 단일 연결 리스트(singly linked list)는 보통 next만 있어 뒤로 순회하거나 임의 인덱스에 직접 접근할 수 없다. 추상 자료형(ADT)은 값·연산·행동을 정하는 것이며 구체적 구현(concrete implementation)이나 실행시간 표 자체가 아니다.
스택의 push·pop은 보통 \(O(1)\)O(1)이다. 큐의 enqueue·dequeue는 원형 배열 또는 front/rear 연결 리스트 구현에서 보통 \(O(1)\)O(1)이다. 연결 리스트에서 값 탐색·인덱스형 접근은 \(\Theta(n)\)Θ(n)이고, 위치를 이미 알고 있을 때 포인터 갱신으로 하는 삽입·삭제는 \(O(1)\)O(1)이다.
문장에 beide, jedes, direkt, nur, typischerweise, konkrete Implementierung이 나오면 용어와 숨은 전제를 먼저 표시한다.
시험 연결
2025년 여름학기(SoSe 2025) 복원 객관식의 섹션 I과 II이다.
\(\text{exactly}_{\text{one}}\)exactly(one)
\(\text{exactly}_{\text{two}}\)exactly(two)
이 단원 문제는 계산보다 단어 함정이 중요하다. LIFO·FIFO, 단일·이중 연결, ADT·구현, 그리고 '이미 알고 있는 포인터(known pointer)' 같은 전제어를 먼저 확인해야 한다.
정답 문장을 외우는 대신 각 선택지가 ADT 수준의 주장인지 구현 수준의 주장인지 분리해 변형 객관식(altered MC)도 판정하도록 훈련한다.
먼저 알아야 할 용어와 전제
- 연산 순서: 후입선출(last-in-first-out, LIFO)과 선입선출(first-in-first-out, FIFO)의 차이를 안다.
- 포인터 개념: 노드는 next와 prev 같은 참조를 저장할 수 있다.
- 인터페이스·행동 명세인 추상 자료형(ADT)과 구체적 표현의 차이를 안다.
- 기본 연산의 최악 실행시간 표기법을 안다.
개념 강의
스택(Stack)은 접시 더미와 같다. 위에 올린 것을 위에서 먼저 꺼낸다. 큐(Queue)는 줄과 같아서 먼저 선 사람이 먼저 나간다. 연결 리스트(linked list)는 배열처럼 칸 번호로 바로 뛰어가는 구조가 아니라, 노드가 다음 노드를 가리키는 길이다. ADT는 '메뉴판'이고 구현(implementation)은 '주방 설비'다.
스택 ADT(Stack ADT)는 new, isEmpty, push, pop을 제공하고 후입선출(LIFO)을 만족한다. 큐 ADT(Queue ADT)는 new, isEmpty, enqueue, dequeue를 제공하고 선입선출(FIFO)을 만족한다. 단일 연결 리스트(singly linked list, einfach verkettete Liste)의 각 원소는 다음 원소를 가리키는 next 포인터를 가지지만 이전 원소를 가리키는 prev 포인터는 없다. 이중 연결 리스트(doubly linked list, doppelt verkettete Liste)는 next와 prev를 모두 가져 앞뒤 순회가 가능하다. 추상 자료형(ADT, abstrakter Datentyp)은 가능한 값과 연산 및 행동을 설명하며, 배열인지 리스트인지 같은 저장 방식은 별도의 구현 문제다.
- 원소 삽입 순서와 제거 순서를 작은 예시로 추적할 수 있어야 합니다.
- next 포인터와 prev 포인터의 차이를 알아야 한다.
- \(O(1)\)
O(1)과 \(\Theta(n)\)Θ(n)의 차이를 '입력 크기에 따라 비용이 변하는가'로 판단할 수 있어야 한다.
스택 불변식(Stack invariant)에 따르면 pop은 아직 제거되지 않은 원소 중 가장 최근에 push된 원소를 반환한다. 큐 불변식(Queue invariant)에 따르면 dequeue는 아직 제거되지 않은 원소 중 가장 오래전에 enqueue된 원소를 반환한다. 단일 연결 리스트는 현재 노드에서 next 방향으로 갈 수 있지만 prev 포인터나 보조 정보 없이는 뒤로 갈 수 없다. 같은 큐 ADT도 원형 배열(circular array), 단일 연결 리스트 또는 두 스택(two-stack) 방식 등 여러 구현을 가질 수 있다.
강의 03의 실행시간 표에서 스택의 push·pop과 큐의 enqueue·dequeue는 보통 \(\Theta(1)\)Θ(1)이다. 연결 리스트에서 값 탐색은 \(\Theta(n)\)Θ(n)이며 인덱스처럼 임의 위치에 곧바로 접근하는 것은 기본 직접 연산이 아니다. 이미 알고 있는 노드·위치에서 삽입·삭제는 \(\Theta(1)\)Θ(1)일 수 있지만, 값이나 이전 노드를 찾는 데는 \(\Theta(n)\)Θ(n)이 들 수 있다. 단일 연결 노드는 prev가 없으므로 이중 연결 노드보다 포인터 저장 공간이 적다.
빈 스택이나 큐에서 pop 또는 dequeue를 하면 명세에 따라 언더플로(underflow)나 오류가 발생한다. enqueue(x) 직후 dequeue()가 x를 반환하는 것은 enqueue 전에 큐가 비어 있었을 때뿐이며, 그렇지 않으면 더 오래된 맨 앞 원소가 먼저 나온다. 단일 연결 리스트 끝에 추가하는 비용은 표현 방식에 따라 달라서 tail 포인터가 있으면 \(O(1)\)O(1)이지만 head 포인터만 있으면 순회가 필요할 수 있다. 또한 이미 알고 있는 노드를 삭제하는 것과 값으로 삭제하는 것은 다르며, 값으로 삭제하려면 이전 노드를 찾아야 할 수 있다.
- beide
- jedes
- direkter Zugriff
- nur dann
- typischerweise
- konkrete Implementierung
- einfach
- doppelt
- ohne Entfernen
2026년 강의의 연결 리스트 알고리즘은 주로 이중 연결 리스트 연산을 보여 주지만, Sheet05는 단일 연결 리스트를 명시적으로 묻는다. 단일 연결 리스트에 관한 주장은 해당 연습문제와 공식 풀이를 직접 근거로 삼는다.
Stack·Queue·List 상태 추적기
다음 상태를 먼저 예측한 뒤 한 단계 실행하여 확인하세요.
새 문장 판별 체크리스트
- 먼저 ADT 용어를 표시한다. 스택(Stack), 큐(Queue), ADT가 나오면 허용 연산과 행동만으로 판단한다.
- 작은 추적(trace)을 쓴다. 스택·큐에 a 다음 b를 넣고 무엇이 먼저 나오는지 확인한다.
- 리스트 문장에서는 next만 있는지, prev도 있는지, tail 포인터가 있는지 확인한다.
- 실행시간 문장에서는 '이미 알고 있는 포인터·위치(known pointer/position)'인지 '값·인덱스로 탐색(search by value/index)'인지 분리한다.
- 강한 표현을 조심한다. beide, jedes, direkt, nur, immer는 작은 반례 하나로 깨질 수 있다.
- ADT와 구현(implementation)을 섞는 문장은 거의 항상 함정이다.
능동 회상
- 스택과 큐를 각각 LIFO·FIFO 용어로 한 문장씩 정의하라. — 스택은 LIFO라서 마지막에 push한 원소가 먼저 pop된다. 큐는 FIFO라서 먼저 enqueue한 원소가 먼저 dequeue된다.
- 단일 연결 리스트(einfach verkettete Liste)와 이중 연결 리스트(doppelt verkettete Liste)의 포인터 차이를 말하라. — 단일 연결(singly/einfach)은 보통 next만 저장하고 이전 노드 포인터(predecessor pointer)가 없다. 이중 연결(doubly/doppelt)은 next와 prev를 저장한다.
- 연결 리스트에서 값으로 탐색(search by value)과 이미 알고 있는 노드 삭제(delete known node)의 실행시간 차이를 설명하라. — 값으로 탐색하려면 head부터 따라가야 하므로 최악의 경우 \(\Theta(n)\)
Θ(n)이다. 이미 노드 포인터가 있으면 삭제 자체는 포인터 갱신으로 \(O(1)\)O(1)일 수 있다. - 큐 [y]에 enqueue(x)를 하고 바로 dequeue하면 무엇이 나오는가? 그 이유도 말하라. — y가 나온다. 큐는 FIFO이므로 이미 있던 맨 앞(front) 원소가 새로 들어온 x보다 먼저 나온다.
- ADT와 구현(implementation)의 차이를 스택 예시로 설명하라. — 스택 ADT는 push·pop·isEmpty와 LIFO 행동을 정한다. 배열 스택인지 연결 리스트 스택인지는 구체적 구현(concrete implementation)이다.
구두시험 질문
- 스택 ADT의 표준 연산만 사용할 때 중간 원소에 pop 없이 접근할 수 없음을 작은 예시로 설명하라.
- II-4 A의 '포인터 조정에 의한 삽입·삭제(insert/delete by pointer adjustment)'가 왜 참인지, 어떤 전제가 빠지면 위험한지 설명하라.
- ADT가 실행시간을 직접 정하지 않는다는 말을 큐의 두 구현으로 설명하라.
시험 직전 요약
스택 = LIFO, 큐 = FIFO. 단일 연결 리스트 = next만, 이중 연결 리스트 = next + prev. ADT는 행동 계약이며 메모리 배치가 아니다.
스택 push·pop은 \(O(1)\)O(1), 전형적인 front/rear 구현의 큐 enqueue·dequeue는 \(O(1)\)O(1), 연결 리스트 탐색·인덱스형 접근은 \(\Theta(n)\)Θ(n), 위치를 안 뒤 포인터 삽입·삭제는 \(O(1)\)O(1)이다.
enqueue(x) 뒤 dequeue()가 x를 반환하는 것은 이전에 큐가 비어 있었을 때뿐이다. tail 포인터가 없으면 단일 연결 리스트 끝에 추가할 때 순회가 필요할 수 있다.
원소 두 개의 추적을 쓰고 node(value,next)를 그린 뒤, 문장이 ADT 수준인지 구현 수준인지 표시한다.
출처
- 출처 파일: AuD Gedächtnisprotokoll SoSe 2025.md; 근거 페이지·구간: MC section, chunk window 1; 뒷받침하는 내용: 2025년 여름학기(SoSe 2025) 복원 문항 I-2, I-3, II-3, II-4의 문구와 각각 하나·둘을 고르는 선택 규칙을 뒷받침한다.; 검증 상태: verified; 자료의 역할: reconstructed_exam; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Vorlesung\03BasicDataStructures.pdf; 근거 페이지·구간: pp. 3-9; 뒷받침하는 내용: 추상 자료형(ADT)과 구체적 자료구조를 구분하고, 후입선출(LIFO) 방식의 스택 연산과 배열 기반 push·pop을 정의한다.; 검증 상태: verified; 자료의 역할: current_lecture; course term: ADT, Stack, LIFO; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Vorlesung\03BasicDataStructures.pdf; 근거 페이지·구간: pp. 19-27; 뒷받침하는 내용: 연결 리스트 노드의 next 포인터와 이중 연결 리스트의 prev 포인터를 정의하며, 탐색은 선형 시간이고 위치를 가리키는 포인터를 이미 알 때 삽입·삭제는 상수 시간임을 설명한다.; 검증 상태: verified; 자료의 역할: current_lecture; course term: verkettete Listen; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Vorlesung\03BasicDataStructures.pdf; 근거 페이지·구간: pp. 28-38; 뒷받침하는 내용: 큐를 선입선출(FIFO) 구조로 정의하고, 원형 배열과 단일 연결 리스트의 enqueue·dequeue 연산 및 스택·큐·연결 리스트의 실행시간을 정리한다.; 검증 상태: verified; 자료의 역할: current_lecture; course term: Queue, FIFO; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Übung\AuD26_Sheet04.pdf; 근거 페이지·구간: pp. 1-3; 뒷받침하는 내용: 현재 연습문제에서 추상 자료형, 스택, 큐와 스택·큐의 여러 구현을 직접 다룬다.; 검증 상태: verified; 자료의 역할: exercise_sheet; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Übung\AuD26_Sheet04-Sol.pdf; 근거 페이지·구간: pp. 4-5; 뒷받침하는 내용: 공식 풀이에서 스택의 pop이 맨 위 원소를 제거함을 확인하고, 원형 큐의 front·rear 동작 및 두 스택·두 큐 구현에서 \(O(1)\)
O(1)과 \(O(n)\)O(n)연산을 구분한다.; 검증 상태: verified; 자료의 역할: official_solution; 추출 품질: \(\text{clean}_{\text{text}}\)clean(text) - 출처 파일: Übung\AuD26_Sheet05.pdf; 근거 페이지·구간: pp. 1-2; 뒷받침하는 내용: 현재 연습문제는 단일 연결 리스트를 각 원소가 다음 원소만 가리키며 이전 원소 포인터는 없는 리스트로 정의한다.; 검증 상태: verified; 자료의 역할: exercise_sheet; 추출 품질: \(\text{clean}_{\text{text}}\)
clean(text) - 출처 파일: Übung\AuD26_Sheet05-Sol.pdf; 근거 페이지·구간: pp. 1-2; 뒷받침하는 내용: 공식 풀이에서 단일·이중 연결 리스트를 비교한다. 이중 연결 리스트는 앞뒤 순회와 이미 아는 노드의 \(O(1)\)
O(1)삭제를 지원하고, 단일 연결 리스트는 메모리와 포인터 갱신 수가 더 적다.; 검증 상태: verified; 자료의 역할: official_solution; 추출 품질: \(\text{clean}_{\text{text}}\)clean(text)
AI 후속 학습 프롬프트
마지막 생성: 2026-08-03 03:24