[JavaScript-์ž๋ฃŒ๊ตฌ์กฐ] Stack

Hannahhhยท2022๋…„ 9์›” 20์ผ
0

JavaScript

๋ชฉ๋ก ๋ณด๊ธฐ
39/47

๐Ÿ” Stack


๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์Œ“๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ, ์ž…์ถœ๋ ฅ์ด ํ•˜๋‚˜์˜ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ์ œํ•œ์  ์ ‘๊ทผ์ด ํŠน์ง•์ด๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๊ณ (FILO), ๋ฐ˜๋Œ€๋กœ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋“ค์–ด๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค(LIFO).

์ด ๋•Œ, Stack์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์„ push, ๊บผ๋‚ด๋Š” ๊ฒƒ์„ pop์ด๋ผ๊ณ  ํ•œ๋‹ค.


Stack์˜ ํŠน์ง•์„ ์ •๋ฆฌํ•˜์ž๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • LIFO(Last In First Out)

  • ๋ฐ์ดํ„ฐ๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์•„๋„ ํ•˜๋‚˜์”ฉ ๋„ฃ๊ณ  ๋บ„ ์ˆ˜ ์žˆ๋‹ค.
    (ํ•œ๊บผ๋ฒˆ์— ์—ฌ๋Ÿฌ๊ฐœ X)

  • ํ•˜๋‚˜์˜ ์ž…์ถœ๋ ฅ ๋ฐฉํ–ฅ

  • ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์œ ํ•œํ•˜๋ฉฐ ์ •์ ์ด๋‹ค.

  • ์Šคํƒ์˜ ํฌ๊ธฐ๋Š” ์ œํ•œ๋˜์–ด์žˆ๋‹ค.(์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ ์ž์ฃผ ๋ฐœ์ƒ)



โœ” ๊ธฐ๋ณธ ์ฝ”๋“œ

class Stack {
  constructor() {
    this.storage = {};
    this.top = 0; // Stack์˜ ์ตœ์ƒ๋‹จ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜(0์œผ๋กœ ์ดˆ๊ธฐํ™”)
  }
  
  // stack์˜ size
  // this.top = Stack์ด ์Œ“์ผ ๋•Œ๋งˆ๋‹ค ++,
  // this.top = Stack์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋  ์š”์†Œ์˜ index,(top์˜ ๊ฐ’์€ size์™€ ๋™์ผ)
  size() {
    return this.top;
  }


  // stack์— element(๋ฐ์ดํ„ฐ)์ถ”๊ฐ€
  // key : ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋  element์˜ index๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” this.top
  // value : element
  // key์™€ value๋ฅผ storage์— ํ• ๋‹นํ•˜๊ณ , this.top์€ ๋‹ค์Œ ์ธ๋ฑ์Šค๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•˜์—ฌ ์ƒˆ๋กœ์šด element์— ๋Œ€๋น„
  push(element) {
    this.storage[this.top] = element;
    this.top += 1;
  }
	
	// ๊ฐ€์žฅ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์™€์•ผ ํ•œ๋‹ค.
  // stack์—์„œ element๋ฅผ ์ œ๊ฑฐํ•œ ๋’ค, ํ•ด๋‹น element๋ฅผ return.
  // ๋งŒ์•ฝ size๊ฐ€ 0์ด๋ผ๋ฉด ์•„๋ฌด๊ฒƒ๋„ return ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  // top-1(๊ฐ€์žฅ ๋‚˜์ค‘์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” index)๋กœ ์ตœ์ƒ๋‹จ์„ ์„ค์ •ํ•œ ํ›„ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ณ , Stack์—์„œ ์ œ๊ฑฐ.
  // ํ•˜๋‚˜๋ฅผ ์ œ๊ฑฐํ–ˆ์œผ๋‹ˆ top-1.
  pop() {
    if (this.size() <= 0) {
      return;
    }

    const result = this.storage[this.top-1];
    delete this.storage[this.top-1];
    this.top -= 1;
    
    return result;
  }
}

// ์ž…์ถœ๋ ฅ
const stack = new Stack();

stack.size(); // 0
for(let i = 1; i < 10; i++) {
  	stack.push(i);
}
stack.pop(); // 9
stack.pop(); // 8
stack.size(); // 7
stack.push(8);
stack.size(); // 8
...




๐Ÿ‘€ ์‹ค์‚ฌ์šฉ ์˜ˆ์‹œ


โœ” ๋ธŒ๋ผ์šฐ์ €์˜ ๋’ค๋กœ ๊ฐ€๊ธฐ, ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„


๋ธŒ๋ผ์šฐ์ €์—์„œ Stack์ด ์‚ฌ์šฉ๋  ๋•Œ, ์•„๋ž˜์˜ ์ˆœ์„œ๋ฅผ ๊ฑฐ์นœ๋‹ค.

  1. ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€ ์ ‘์† -> ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ prev Stack์— ๋ณด๊ด€

  2. ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ -> ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ Next Stack์— ๋ณด๊ด€, ํ˜„์žฌ ํŽ˜์ด์ง€๋กœ Prev Stack์— ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋ณด๊ด€๋œ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ด

  3. ์•ž์œผ๋กœ ๊ฐ€๊ธฐ ๋ฒ„ํŠผ -> Next Stack์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณด๊ด€๋œ ํŽ˜์ด์ง€๋ฅผ ๊ฐ€์ ธ์˜ด, ํ˜„์žฌ ํŽ˜์ด์ง€๋ฅผ Prev Stack์— ๋ณด๊ด€



๊ตฌํ˜„ ์ฝ”๋“œ

function browserStack(actions, start) {
  
  // start๊ฐ€ string์ด ์•„๋‹ˆ๋ฉด return false
  if(typeof start !== 'string'){
    return false;
  }
  
  // ๋’ค๋กœ ๊ฐ€๊ธฐ, ํ˜„์žฌ, ์•ž์œผ๋กœ ๊ฐ€๊ธฐ stack์˜ ๋ณ€์ˆ˜ ์„ค์ •
  let prev = [];
  let now = start;
  let next = [];

  // actions ๋ฐฐ์—ด์„ ์ „๋ถ€ ํƒ์ƒ‰
  for(let action of actions){
    // ๋งŒ์•ฝ actions์˜ ์š”์†Œ๊ฐ€ -1์ด๊ณ (๋’ค๋กœ๊ฐ€๊ธฐ), prevStack์˜ ๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹ ๋•Œ(์ด์ „์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด)
    if(action === -1 && prev[0]){
      // ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ next์— ๋„ฃ๊ณ 
      next.push(now);
      // prev์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์š”์†Œ ๊บผ๋‚ด์™€์„œ ํ˜„์žฌ ํŽ˜์ด์ง€์— ํ• ๋‹น
      now = prev.pop()
      
      //๋งŒ์•ฝ actions์˜ ์š”์†Œ๊ฐ€ 1์ด๊ณ (์•ž์œผ๋กœ ๊ฐ€๊ธฐ), nextStack์˜ ๊ธธ์ด๊ฐ€ 0์ด ์•„๋‹ ๋•Œ(๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๋ฉด)
    }else if(action === 1 && next[0]){
      // ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ prev์— ๋„ฃ๊ณ 
    	prev.push(now);
      // next์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์š”์†Œ ๊บผ๋‚ด์™€์„œ ํ˜„์žฌ ํŽ˜์ด์ง€์— ํ• ๋‹น
    	now = next.pop();
     
      // ๋งŒ์•ฝ actions ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ string์ด๋ผ๋ฉด (์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ผ๋ฉด)
    }else if(typeof action === 'string'){
      // ๋‚ด๊ฐ€ ๋ณด๊ณ ์žˆ๋˜ ํŽ˜์ด์ง€๋Š” prev์— ๋„ฃ์–ด์ฃผ๊ธฐ
      prev.push(now);
      // action์œผ๋กœ ๋“ค์–ด์˜จ ํŽ˜์ด์ง€๊ฐ€ ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€ ๋จ
      now = action
      // ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋Š” ์•ž์œผ๋กœ ๊ฐˆ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ next ์Šคํƒ์„ ๋น„์›Œ์•ผ ํ•จ
      next = [];
    }
  }
  // ๋ฐฐ์—ด์— stack์˜ ๋ณ€์ˆ˜๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด์•„์„œ return
  return [prev, now, next]
}

// ์ž…์ถœ๋ ฅ
const actions = ["B", "C", -1, "D", "A", -1, 1, -1, -1];
const start = "A";
const output = browserStack(actions, start);

console.log(output); // [["A"], "B", ["A", "D"]]

const actions2 = ["B", -1, "B", "A", "C", -1, -1, "D", -1, 1, "E", -1, -1, 1];
const start2 = "A";
const output2 = browserStack(actions2, start2);

console.log(output2); // [["A", "B"], "D", ["E"]]




Reference: ์ฝ”๋“œ์Šคํ…Œ์ด์ธ 

0๊ฐœ์˜ ๋Œ“๊ธ€