3 min read

JavaScript๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ํ(Queue), ์Šคํƒ(Stack)

Table of Contents

์ง€๋‚œ ๋ฉด์ ‘ ์ค‘ ํ•œ ๋ฒˆ์€ ํ์™€ ์Šคํƒ์„ ํ™”์ดํŠธ๋ณด๋“œ์— ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๋ผ๋Š” ์‹œ๊ฐ„์ด ์žˆ์—ˆ๋‹ค. ์ฝ”๋”ฉ์€ ํ–ˆ์ง€๋งŒ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด ๋‚จ์•„ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.

ํ์™€ ์Šคํƒ์€ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐํ˜•์ด๋ฉด์„œ ์„ ํ˜•(linear)์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ Array๋กœ ๊ตฌํ˜„์ด ์ถฉ๋ถ„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ ๊ตฌํ˜„ํ•ด๋ณด์ž.

ํ (Queue)

ํ๋Š” ๋จผ์ € ์ง‘์–ด๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ด ํŠน์ง•์„ ์ค„์—ฌ์„œ **FIFO(First In First Out)**๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ๋Š” enqueue
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” dequeue
  • ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด length
  • ๋‹ค์Œ์— ๋‚˜์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๋Š” peek
  • ํ˜„์žฌ ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” isEmpty
  • ํ˜„์žฌ ํ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” clear

์œ„ 6๊ฐ€์ง€ ์ •๋„ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜์ž.

class Queue {
  constructor() {
    this.arr = [];
  }

  enqueue(value) {
    this.arr.push(value);
  }

  dequeue() {
    return this.arr.shift();
  }

  length() {
    return this.arr.length;
  }

  peek() {
    return this.arr[0];
  }

  isEmpty() {
    return this.arr.length === 0;
  }

  clear() {
    this.arr = [];
  }
}

const queue = new Queue();

// ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
queue.enqueue(1); // arr: [1]
queue.enqueue(20); // arr: [1, 20]
queue.enqueue(300); // arr: [1, 20, 300]

// ๋ฐ์ดํ„ฐ ์ถ”์ถœ
queue.dequeue(); // 1

// ํ˜„์žฌ ํ ๊ธธ์ด
queue.length(); // 2

// ๋‹ค์Œ์— ์ถ”์ถœ๋  ๋ฐ์ดํ„ฐ
queue.peek(); // 20

// ํ๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
queue.isEmpty(); // false

// ํ ์ดˆ๊ธฐํ™”
queue.clear();

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ์กฐ๊ธˆ ๋” ์‹ ๊ฒฝ์„ ์“ด๋‹ค๋ฉด, dequeue๋‚˜ peek๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์—ด์ด ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ์—๋Š” undefined๋ฅผ ๋ฆฌํ„ดํ• ํ…๋ฐ ๊ทธ ๋ถ€๋ถ„์„ ํŠน์ •ํ•œ ๋ฐ์ดํ„ฐ๋‚˜ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ •๋„, ๋˜๋Š” ๋น„์–ด์žˆ๋‹ค๊ณ  ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๋Š” ์ •๋„๋กœ ํŠœ๋‹์ด ๊ฐ€๋Šฅํ•˜๊ฒ ๋‹ค.


์Šคํƒ (Stack)

์Šคํƒ ๋‚˜์ค‘์— ์ง‘์–ด๋„ฃ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ๋‚˜์˜ค๋Š” ์„ ํ˜•์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์ด ํŠน์ง•์„ ์ค„์—ฌ์„œ **LIFO(Last In First Out)**๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ๋Š” push
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” pop
  • ํ˜„์žฌ ๋ฐ์ดํ„ฐ์˜ ๊ธธ์ด length
  • ๋‹ค์Œ์— ๋‚˜์˜ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•˜๋Š” peek
  • ํ˜„์žฌ ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” isEmpty
  • ํ˜„์žฌ ์Šคํƒ์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” clear

ํ์™€ ๊ฐ™์ด, ์œ„ 6๊ฐ€์ง€ ์ •๋„ ๊ธฐ๋Šฅ๋งŒ ๊ตฌํ˜„ํ•ด๋ณด๋„๋ก ํ•˜์ž.

class Stack () {
  constructor () {
    this.arr = []
  }

  push (value) {
    this.arr.push(value)
  }

  pop () {
    return this.arr.pop()
  }

  length () {
    return this.arr.length
  }

  peek () {
    return this.arr[this.arr.length - 1]
  }

  isEmpty () {
    return this.arr.length === 0
  }

  clear () {
    this.arr = []
  }
}

const stack = new Stack()

// ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
stack.push(1) // arr: [1]
stack.push(20) // arr: [1, 20]
stack.push(300) // arr: [1, 20, 300]
stack.push(4000) // arr: [1, 20, 300, 4000]

// ๋ฐ์ดํ„ฐ ์ถ”์ถœ
stack.pop() // 4000

// ํ˜„์žฌ ์Šคํƒ ๊ธธ์ด
stack.length() // 3

// ๋‹ค์Œ์— ์ถ”์ถœ๋  ๋ฐ์ดํ„ฐ
stack.peek() // 300

// ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธ
stack.isEmpty() // false

// ์Šคํƒ ์ดˆ๊ธฐํ™”
stack.clear()

๋งˆ๋ฌด๋ฆฌ

๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ์ ˆ๋Œ€ ์–ด๋ ต์ง€ ์•Š์œผ๋ฉฐ ์ดํ•ดํ•˜๊ณ  ์žˆ์œผ๋ฉด ๋ถ„๋ช… ๋„์›€๋  ๋‚ด์šฉ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์ฝœ ์Šคํƒ, ํƒœ์Šคํฌ ํ ๋ผ๋Š” ์šฉ์–ด๊ฐ€ ๋“ฑ์žฅํ•˜๋Š”๋ฐ, ์œ„ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์ˆ˜์›”ํ•  ๊ฒƒ์ด๋‹ค.