Post

스택(Stack)과 큐(Queue)

스택(Stack)과 큐(Queue)

스택(Stack)과 큐(Queue)란?

스택과 큐는 데이터를 저장하고 꺼내는 순서를 규정한 선형 자료구조(linear data structure) 임.


스택(Stack)

  • 마지막에 들어온 데이터가 가장 먼저 나가는 구조(LIFO, Last In First Out)
  • 즉, “나중에 넣은 것이 먼저 나온다.” 라는 특징을 가짐.

예를 들어, 접시를 쌓아두는 것을 생각하면 이해하기 쉬움.
맨 위에 놓은 접시가 가장 먼저 꺼내짐.

✅ 주요 연산

연산설명
push(item)스택에 데이터 추가
pop()가장 위의 데이터 제거 및 반환
peek()최상단 데이터 조회(제거하지 않음)
isEmpty()스택이 비어있는지 확인

💻 예제 코드 (JavaScript)

1
2
3
4
5
6
7
8
9
10
11
const stack = [];

stack.push(1);
stack.push(2);
stack.push(3);
console.log(stack); // [1, 2, 3]

console.log(stack.pop()); // 3
console.log(stack); // [1, 2]

console.log(stack[stack.length - 1]); // 2 (peek)

큐(Queue)

  • 먼저 들어온 데이터가 먼저 나가는 구조(FIFO, First In First Out)
  • 즉, “먼저 온 것이 먼저 나간다.”

은행 창구나 버스 줄을 생각하면 이해하기 쉬움.

✅ 주요 연산

연산설명
enqueue(item)큐의 뒤쪽에 데이터 추가
dequeue()큐의 앞쪽에서 데이터 제거 및 반환
front()큐의 맨 앞 데이터 조회
isEmpty()큐가 비어있는지 확인

💻 예제 코드 (JavaScript)

1
2
3
4
5
6
7
8
9
10
11
const queue = [];

queue.push(1);
queue.push(2);
queue.push(3);
console.log(queue); // [1, 2, 3]

console.log(queue.shift()); // 1
console.log(queue); // [2, 3]

console.log(queue[0]); // 2 (front)

⚖️ 스택 vs 큐 비교

구분스택(Stack)큐(Queue)
구조LIFO (후입선출)FIFO (선입선출)
삽입 위치top(맨 위)rear(뒤쪽)
삭제 위치top(맨 위)front(앞쪽)
주요 메서드push(), pop()enqueue(), dequeue()
  • 둘 다 선형(일렬(순서가 있는 형태)) 구조이며, 탐색보다 ‘순서 제어’가 핵심

알고리즘 예시

프로그래머스 - 같은 숫자는 싫어

내가 푼 방식

1
2
3
4
5
6
7
8
9
10
11
function solution(arr) {
    var answer = [];
    for(let i = 0 ; i < arr.length ; i++) {
        if(answer.length == 0) {
            answer.push(arr[i]);
        } else if(answer[answer.length-1] !== arr[i]) {
            answer.push(arr[i]);
        }
    }
    return answer;
}

스택 풀이로 표현하자면 ? (조금 더 명시적으로)

1
2
3
4
5
6
7
8
9
10
11
function solution(arr) {
  const stack = [];

  for (let num of arr) {
    if (stack[stack.length - 1] !== num) {
      stack.push(num);
    }
  }

  return stack;
}

프로그래머스 - 올바른 괄호

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function solution(s){
    const array = s.split("");
    const stack = [];
    
    if(array[0] === ")") return false;
    
    for(let str of array) {
        if(stack[stack.length - 1] === "(" && str === ")") {
            stack.pop();
        } else {
            stack.push(str);
        }
    }

    return stack.length === 0;
}

END

This post is licensed under CC BY 4.0 by the author.