์Šคํƒ(Stack)

์Šคํƒ(Stack)์ด๋ž€?

ํ›„์ž…์„ ์ถœ(LIFO, Last In First Out)์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋Š”

  1. ํ•จ์ˆ˜ ํ˜ธ์ถœ(call stack)์„ ๋‹ค๋ฃจ๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ
  2. Undo(๋˜๋Œ๋ฆฌ๊ธฐ)/Redo(๋‹ค์‹œ์‹คํ–‰)
  3. ์ธํ„ฐ๋„ท์˜ ๋ฐฉ๋ฌธ๊ธฐ๋ก(ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ) ๋“ฑ์—์„œ ์ฃผ๋กœ ํ™œ์šฉ๋œ๋‹ค.

๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ ๊ตฌํ˜„

// ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฐฉ์‹ 1
var stack = [];
stack.push("stack1");
stack.push("stack2");
stack.push("stack3");
stack.pop();
stack.pop();
stack.pop();
 
// ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฐฉ์‹ 2 => ๋ฐฉํ–ฅ๋งŒ ๋ฐ”๋€œ.
// ์•ž์—์„œ ์ œ๊ฑฐ ๋ฐ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ฑ์Šค๋ฅผ ๊ณ„์† ๋ฐ€๊ณ  ๋‹น๊ฒจ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํšจ์œจ์ ์ด์ง€ ์•Š์Œ
stack.unshift("stack1");
stack.unshift("stack2");
stack.unshift("stack3");
stack.shift();
stack.shift();
stack.shift();

๊ตฌํ˜„์ด๋ผ๊ณ  ํ•˜๊ธฐ๋„ ๋ฏผ๋งํ•˜๋„ค ๊ทธ๋ƒฅ ๋นŒํŠธ์ธ ๋ฉ”์„œ๋“œ ์“ฐ๋ฉด ๋œ๋‹ค ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ์Šคํƒ ๋ง๊ณ ๋„ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ๋„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์–‘๋ฐฉํ–ฅ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์‚ด์ง ํˆฌ๋จธ์น˜

//์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๋ฐฉ์‹
class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}
 
class Stack {
  constructor() {
    this.first = null;
    this.last = null;
    this.size = 0;
  }
  // ์•ž์—์„œ ๊ฐ’์„ ๋„ฃ๋Š” push ๋ฉ”์„œ๋“œ
  push(val) {
    var newNode = new Node(val);
    if (!this.first) {
      this.first = newNode;
      this.last = newNode;
    } else {
      var temp = this.first;
      this.first = newNode;
      this.first.next = temp;
    }
    return ++this.size;
  }
  // ์•ž์—์„œ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๋นผ๋Š” pop ๋ฉ”์„œ๋“œ
  pop() {
    if (!this.head) return null;
    var temp = this.first;
    if (this.first === this.last) this.last = null;
    this.first = this.first.next;
    this.size--;
    return temp.value;
  }
}
 

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

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

๋˜ํ•œ ๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งค์šฐ ๋งŽ์•„์กŒ์„ ๋•Œ ๊ทธ๋ƒฅ ๋ฐฐ์—ด์„ ์ด์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค ๋‚ซ๋‹ค.

์‹œ๊ฐ„๋ณต์žก๋„

์—ฐ์‚ฐ์‹œ๊ฐ„ ๋ณต์žก๋„
์‚ฝ์ž…
์‚ญ์ œ
ํƒ์ƒ‰
์ ‘๊ทผ
์ค‘์š”ํ•œ ๊ฒƒ์€ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๊ฐ€ ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ํƒ์ƒ‰์ด๋‚˜ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๊ฒƒ๋“ค์ด ํ•„์š”ํ•œ ์ž‘์—…์ด๋ผ๋ฉด ๋‹ค๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋‚ซ๋‹ค.

ํ•˜์ง€๋งŒ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋Š” ์ „์ฒด๋ฅผ ์ˆœํšŒํ•  ์ด์œ ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ ค ์‚ฝ์ž…๊ณผ ์‚ญ์ œ๋งŒ ํ•„์š”ํ•œ ๋ถ€๋ถ„์—์„œ๋Š” ํšจ์œจ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

ํ(Queue)

ํ(Queue)๋ž€?

ํ๋Š” ์Šคํƒ๊ณผ ๋น„์Šทํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๋ฅผ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. ์Šคํƒ๊ณผ์˜ ์ฐจ์ด์ ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ˆœ์„œ์ธ๋ฐ, ํ๋Š” ์„ ์ž…์„ ์ถœ(FIFO, First In First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

ํ์™€ ๊ฐ™์€ ์„ ์ž…์„ ์ถœ ๊ตฌ์กฐ๋Š” ๋งŽ์€ ๊ณณ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ตฌ์กฐ์ด๋‹ค. ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋„ ๊ทธ๋ ‡๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธก๋ฉด์—์„œ๋Š”

  • ๊ฒŒ์ž„ ๋Œ€๊ธฐ์—ด
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…
  • ์–ด๋–ค ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ๋•Œ
  • ํ”„๋ฆฐํŠธ ๋Œ€๊ธฐ์—ด ๋“ฑ์ด ์žˆ๋‹ค.

ํ ๋˜ํ•œ ์Šคํƒ์ฒ˜๋Ÿผ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ตฌํ˜„

// ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฐฉ์‹ 1
var queue = [];
queue.push("first");
queue.push("second");
queue.push("third");
queue.shift(); //first
queue.shift(); //second
queue.shift(); //third
 
// ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ฐฉ์‹ 2
queue.unshift("first");
queue.unshift("second");
queue.unshift("third");
queue.pop();
queue.pop();
queue.pop();

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

//๋‹จ์ผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๊ตฌํ˜„
class Node {
  constructor(val) {
    this.val = val;
    this.next = null;
  }
}
class Queue {
  constructor(val) {
    this.first = null;
    this.last = null;
    this.size = 0;
  }
  // ๋’ค์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” enqueue ๋ฉ”์„œ๋“œ
  enqueue(val) {
    var newNode = new Node(val);
    if (!this.first) {
      // ์•„๋ฌด๊ฒƒ๋„ ์—†์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ ํ—ค๋“œ์™€ ํ…Œ์ผ ์„ค์ •
      this.first = newNode;
      this.last = newNode;
    } else {
      // ํฌ์ธํ„ฐ ์˜ฎ๊ธฐ๊ธฐ
      this.last.next = newNode;
      this.last = newNode;
    }
  }
  // ์•ž์˜ ๊ฐ’๋“ค์„ ํ•˜๋‚˜์”ฉ ๋นผ๋Š” dequeue ๋ฉ”์„œ๋“œ
  dequeue() {
    if (!this.first) return null;
    var temp = this.first;
    if (this.first === this.last) {
      this.last = null;
    }
    this.first = this.first.next;
    this.size--;
    return temp.val;
  }
}

์‹œ๊ฐ„๋ณต์žก๋„

์—ฐ์‚ฐ์‹œ๊ฐ„๋ณต์žก๋„
์‚ฝ์ž…
์‚ญ์ œ
ํƒ์ƒ‰
์ ‘๊ทผ
๋ฐฐ์—ด์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋Š” ์ด ํ•œ ๋ฐฉํ–ฅ์—์„œ ๋ฐœ์ƒํ–ˆ์œผ๋‚˜ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ์—๋Š” ์ƒ์ˆ˜์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ ๋˜ํ•œ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ์— ํšจ์œจ์ ์ธ ์ž๋ฃŒ๊ตฌ์กฐ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.