Skip to content

์Šคํƒ (Stack) โ€‹

์Šคํƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์Œ“๋Š” ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ์„ ํ˜• ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” ๋งจ ์œ„์— ์Œ“๊ณ , ์ œ๊ฑฐํ•  ๋•Œ๋„ ๋งจ ์œ„์˜ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ํ›„์ž…์„ ์ถœ(LIFO, Last In First Out) ๊ตฌ์กฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์Šคํƒ์˜ ํŠน์ง• โ€‹

์Šคํƒ

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

์ฃผ์š” ์—ฐ์‚ฐ โ€‹

  • push: ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํƒ์˜ ๋งจ ์œ„์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • pop: ์Šคํƒ์˜ ๋งจ ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • peek: ์Šคํƒ์˜ ๋งจ ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • isEmpty: ์Šคํƒ์ด ๋น„์–ด์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

TypeScript ๊ตฌํ˜„ ์˜ˆ์‹œ โ€‹

typescript
class Stack<T> {
  private items: T[] = []

  // ์Šคํƒ์ด ๋น„์—ˆ๋Š”์ง€ ํ™•์ธ
  isEmpty(): boolean {
    return this.items.length === 0
  }

  // ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
  push(item: T): void {
    this.items.push(item)
  }

  // ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ ๋ฐ ๋ฐ˜ํ™˜
  pop(): T | undefined {
    return this.items.pop()
  }

  // ๋งจ ์œ„ ๋ฐ์ดํ„ฐ ํ™•์ธ
  peek(): T | undefined {
    return this.items[this.items.length - 1]
  }

  // ์Šคํƒ ์ถœ๋ ฅ
  print(): void {
    console.log(this.items.join(' '))
  }
}

// ์‚ฌ์šฉ ์˜ˆ์‹œ
const stack = new Stack<number>()
stack.push(1)
stack.push(2)
stack.push(3)
stack.push(4)
stack.push(5)

stack.print() // ์ถœ๋ ฅ: 1 2 3 4 5

console.log(stack.pop()) // ์ถœ๋ ฅ: 5
console.log(stack.peek()) // ์ถœ๋ ฅ: 4