stack

์Šคํƒ

์Šคํƒ: Last In First Out

ํ: First In First Out

ํ˜ธ์ถœ์Šคํƒ ๋ถ„์„

์šฐ์„  ํ˜ธ์ถœ๊ณผ ์„ ์–ธ์„ ๊ตฌ๋ณ„ํ•ด์•ผํ•œ๋‹ค.

  1. (์ต๋ช…)์Šคํƒ: ์‹คํ–‰ํ•˜๋ ค๋Š” ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ ์ต๋ช… ํ•จ์ˆ˜๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

  2. ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ์„ ์–ธ๋ถ€๊ฐ€ ์‹คํ–‰๋จ - a() ํ˜ธ์ถœ์ด ์ƒ๊ธฐ๊ณ  ํ˜ธ์ถœ์Šคํƒ์— a๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

  3. 7๋ฒˆ์งธ ์ค„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

  4. 9๋ฒˆ์งธ ์ค„ console๋„ ํ˜ธ์ถœ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ์Šคํƒ์— log๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋กœ 10๋ฒˆ์งธ ์ฝ”๋“œ์ธ function b()๋กœ ๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ console.log(โ€™aโ€™) ์˜ ์„ ์–ธํ•œ ๋ถ€๋ถ„์œผ๋กœ ๊ฐ€์•ผํ•˜์ง€๋งŒ ์•Œ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ์Šคํƒ์—๋Š” ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. ํ˜ธ์ถœ์Šคํƒ์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋น ์กŒ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

  5. 15๋ฒˆ์งธ ์ค„ b() ๊ฐ€ ํ˜ธ์ถœ์Šคํƒ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. ๊ทธ๋ฆฌ๊ณ  10๋ฒˆ์งธ ์ค„์˜ b()์˜ ์„ ์–ธ ๋ถ€๋ถ„์œผ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  6. 12๋ฒˆ์งธ ์ค„ console.log(โ€™bโ€™)๊ฐ€ ํ˜ธ์ถœ์Šคํƒ์— ๋“ค์–ด๊ฐ”๋‹ค๊ฐ€ ๋น ์ง„๋‹ค.

  7. 13๋ฒˆ์งธ ์ค„ c() ๊ฐ€ ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค. (14๋ฒˆ์งธ ์ค„๋กœ ๊ฐ€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ) 2๋ฒˆ์งธ ์ค„ c()์„ ์–ธ๋ถ€๋กœ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  8. 4๋ฒˆ์งธ ์ค„ console.log(โ€™cโ€™) ๊ฐ€ ํ˜ธ์ถœ์Šคํƒ์— ๋“ค์–ด๊ฐ”๋‹ค ๋น ์ง„๋‹ค.

์„ ์–ธ๋ถ€๊ฐ€ ๋ชจ๋‘ ์‹คํ–‰๋˜๋ฉด ์ด์ œ ํ˜ธ์ถœ์Šคํƒ์— ์Œ“์ธ ํ˜ธ์ถœ๋“ค์ด ๋น ์ ธ๋‚˜๊ฐˆ ์ฐจ๋ก€๋‹ค.

  1. 5๋ฒˆ์งธ ์ค„ c()ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด c๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.

  2. 14๋ฒˆ์งธ ์ค„์˜ b()ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด์„œ b๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.

  3. 16๋ฒˆ์งธ ์ค„์˜ a() ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋ฉด์„œ a ๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ„๋‹ค.

  4. 19๋ฒˆ์งธ ์ค„์˜ c() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด์„œ 2๋ฒˆ์งธ ์ค„์˜ c() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค. 4๋ฒˆ์งธ ์ค„์˜ console.log(โ€™cโ€™)๊ฐ€ ํ˜ธ์ถœ์Šคํƒ์— ๋“ค์–ด๊ฐ”๋‹ค ๋น ์ง„๋‹ค.

๊ฒฐ๋ก : ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ์Šคํƒ์— ๋“ค์–ด๊ฐ€๊ณ  ํ•จ์ˆ˜๊ฐ€ ๋๋‚ ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ์Šคํƒ์—์„œ ๋น ์ ธ๋‚˜์˜จ๋‹ค.

์Šคํƒ ๋ฉ”์„œ๋“œ ํ™œ์šฉ

class ArrayStack {
  static SIZE = 3;
  constructor(size = ArrayStack.SIZE) {
    this.stack = new Float32Array(size);
    this.top = -1;
  }

  push(data) {
    // ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    if (typeof data !== 'number') {
      throw new Error('์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”');
    }
    // ArrayStack์˜ top๊ณผ ArrayStack์˜ size(3 - 1) ์ด ๊ฐ™์œผ๋ฉด Stack Overflow
    if (this.top === this.size - 1) {
      throw new Error('์Šคํƒ์ด ๊ฐ€๋“ ์ฐผ์Šต๋‹ˆ๋‹ค (Stack Overflow) \\n');
    }
		// ์ƒ๊ธฐ 2๊ฐ€์ง€ edge case ์™ธ์—๋Š” ์Šคํƒ ๋์— push
    this.stack[++this.top] = data;
  }

  pop() {
		// ์Šคํƒ ๋ถ€์กฑํ˜„์ƒ ํ™•์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
    if (this.top === -1) {
      console.error('์Šคํƒ์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค (Stack Underflow)');
      return null;
    }
    return this.stack[this.top--];
  }

	// ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋“ค์–ด์˜จ ์ž๋ฃŒ์ธ '์ตœ์ƒ์œ„ ์ž๋ฃŒ'๋ฅผ ์ฝ์€ ํ›„ ์ด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ
  peek() {
    return this.stack[this.top];
  }

	// top์ด 0๋ณด๋‹ค ์ž‘์€์ง€ ํ™•์ธ boolean๊ฐ’ ๋ฐ˜ํ™˜
  isEmpty() {
    return this.top < 0;
  }
}

const arrayStack = new ArrayStack(3)

// arrayStack.push(1)
// arrayStack.push(2)
// arrayStack.push(2)

// arrayStack 
// > ArrayStack {stack: Float32Array(3), top: 2}
// **stack**: Float32Array(3) [1, 2, 3, buffer: ArrayBuffer(12), byteLength: 12, byteOffset: 0, length: 3, Symbol(Symbol.toStringTag): 'Float32Array'] **top**: 2

// arrayStack.pop()
// > 3
// arrayStack.pop()
// > 2
// arrayStack.pop()
// > 1

// arrayStack.isEmpty()
// > false

// arrayStack.pop()
// > ์Šคํƒ์ด ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค (Stack Underflow)
  • peek ๋˜๋Š” top : stack์˜ ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๊ฐ’(ํ˜„์žฌ ๊ฐ’)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • push : stack์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

  • pop : stack์— ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

  • empty : stack์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด ์ฐธ(true), ์—†์œผ๋ฉด ๊ฑฐ์ง“(false)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์Šคํƒ์˜ Big O

์‚ฝ์ž…: O(1)

์ œ๊ฑฐ: O(1)

๊ฒ€์ƒ‰: O(n)

์ ‘๊ทผ: O(n)

Last updated