Kevlog
Published on

알고리즘 - 스택 (Stack)

Authors
  • avatar
    Name
    Kevin Junho Kim
    Twitter

정의

스택(Stack)은 자료구조 중 하나다.

데이터를 저장하는 데 쓰이며, "나중에 넣은 데이터가 먼저 나오는" 방식으로 동작한다.

이를 LIFO(Last-In-First-Out)라고 부른다.

즉, 가장 최근에 추가된 항목이 가장 먼저 제거된다.

스택의 함수

  push(item): 스택에 새로운 항목을 추가.  함수는 스택의 맨 위에 데이터를 삽입한다.

  pop(): 스택에서 가장 최근에 추가된 항목을 제거하. 스택이 비어있을 경우에는 제거할 항목이 없으므로 undefined를 반환하거나 에러를 발생.

  peek(): 스택의 맨 위에 있는 항목을 반환. 스택에서 제거하지 않고 단순히 값을 확인하기 위한 용도로 사용. 스택이 비어있을 경우에는 undefined를 반환하거나 에러를 발생.

  isEmpty(): 스택이 비어있는지 여부를 확인. 비어있으면 true를 반환하고, 아니면 false를 반환.

  size(): 스택에 포함된 항목의 개수를 반환.

  print(): 스택에 포함된 모든 항목을 순서대로 출력.

자바스크립트에서의 스택

function createStack() {
  const stack = []

  function push(item) {
    stack.push(item)
  }

  function pop() {
    if (!isEmpty()) {
      return stack.pop()
    } else {
      console.log('Stack is empty.')
    }
  }

  function peek() {
    return !isEmpty() ? stack[stack.length - 1] : undefined
  }

  function isEmpty() {
    return stack.length === 0
  }

  function size() {
    return stack.length
  }

  function print() {
    console.log(stack)
  }

  return {
    push,
    pop,
    peek,
    isEmpty,
    size,
    print,
  }
}

// Usage
const stack = createStack()
stack.push(1)
stack.push(2)
stack.push(3)
console.log(stack.peek()) // Output: 3
console.log(stack.size()) // Output: 3
stack.pop()
stack.print() // Output: [1, 2]

파이썬에서의 스택

class Stack:
    def __init__(self):
        self.items = []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        if not self.is_empty():
            return self.items.pop()
        else:
            print("Stack is empty.")

    def peek(self):
        return self.items[-1] if not self.is_empty() else None

    def is_empty(self):
        return len(self.items) == 0

    def size(self):
        return len(self.items)

    def print(self):
        print(self.items)

    def __str__(self):
        return str(self.items)

# Usage
stack = Stack()
stack.push(1)
print(stack)  # Output: Stack([1])

사용처

생각을 해봤는데 뒤로가기, 앞으로가기 이런데 써야하는데 리액트는 router-dom이 이미 해당 기능들을 다 갖추고 있다.

이 외에 웹사이트 글자편집기에는 필요없지만,

드래그 드랍으로 뭔가를 옮겼을때, undo 혹은 recover 기능을 추가하고싶다면,

스택이 아주 유용할거 같다.

즉, 우리 키보드에서 crtl + z 기능이나 다시 복원 crtl + y 정도 만들떄 사용하면 좋다.