스택(Stack)

2022. 11. 11. 12:42·컴퓨터 과학/자료구조

스택(Stack)

- LIFO(Last In First Out) 으로 데이터를 저장하는 구조입니다.

- 나중에 들어온 데이터가 먼저 나갑니다.

- 주요 동작으로는 push, pop, peek 등이 있습니다.

- push(데이터) : 스택에 데이터 추가

- pop() : 스택으로부터 최상단에 있는 데이터 제거

- peek() : 스택 최상단에 있는 데이터 값 반환

JavaScript 로 스택 구현(feat. Array)

class Stack {
  constructor() {
    // item들을 받을 배열 생성
    this.stack = [];
  }
  
  isEmpty() {
    return this.stack.length == 0;
  }
  
  push(item) {
    this.stack.push(item);
  }
  
  pop() {
    return this.stack.pop();
  }
  
  peek() {
    if (this.isEmpty()) return null;
    return this.stack[this.stack.length - 1];
  }
}

const stack = new Stack();
stack.push(1); // stack: [1]
stack.push(2); // stack: [1, 2]
stack.push(3); // stack: [1, 2, 3]

console.log(stack.pop()); // 3

JavaScript 로 Stack 구현(feat. Linked List)

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class Stack {
  constructor() {
    this.top = null;
  }
  
  isEmpty() {
    return this.top == null;
  }
  
  push(data) {
    const newNode = new Node(data);
    newNode.next = this.top;
    this.top = newNode;
  }
  
  pop() {
    if (this.isEmpty()) return;
    this.top = this.top.next;
  }
  
  peek() {
    if (this.isEmpty()) return null;
    return this.top.data;
  }
}

스택의 시간 복잡도

삽입 : 스택에 들어 있는 값들이 무수히 많아도 데이터 삽입은 한 번이기 때문에 시간 복잡도는 O(1) 이 됩니다.

삭제 : LIFO 에 따라 삭제 시 최상위 데이터만 삭제되므로 스택의 크기에 상관없이 시간 복잡도는 O(1) 이 됩니다.

접근 : 스택 특성상 한쪽 끝으로만 자료를 넣고 뺄 수 있는 구조이므로 데이터 접근 또한 데이터가 삽입된 top을 통해서만 접근 가능합니다. 따라서 n번째 접근은 top 데이터부터 순회하기 때문에 시간 복잡도는 O(n) 이 됩니다.

탐색 : 데이터 탐색 시 만약 스택의 가장 최상단에 있는 데이터를 찾는다면 시간 복잡도는 O(1) 일 것입니다. 하지만 가장 밑에 있는 데이터를 탐색한다면 데이터의 개수 n 만큼 작업이 발생하므로 시간 복잡도는 O(n) 일 것입니다.

시간 복잡도 삽입 삭제 접근 n번째 접근 탐색
스택 O(1) O(1) O(1) O(n) O(n)

 

스택 사용 사례 :

- 함수 실행 컨텍스트들이 쌓이는 Call Stack 과 브라우저의 방문 기록이 쌓이는 History Stack 이 대표적입니다.

- 재귀적으로 함수를 호출해야 하는 경우 임시 데이터를 스택에 넣어줍니다.

 

'컴퓨터 과학 > 자료구조' 카테고리의 다른 글

큐(Queue)  (0) 2022.11.11
ADT 와 Data Structure 의 차이  (0) 2022.11.11
자료구조의 구분  (0) 2022.11.08
'컴퓨터 과학/자료구조' 카테고리의 다른 글
  • 큐(Queue)
  • ADT 와 Data Structure 의 차이
  • 자료구조의 구분
rondeveloper
rondeveloper
  • rondeveloper
    Ron's learning record
    rondeveloper
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • k8s (1)
      • AWS (1)
      • 리눅스 (3)
      • Docker (8)
      • 라이브러리 & 프레임워크 (14)
        • React (2)
        • NestJS (8)
        • Spring (0)
        • Django (3)
        • FastAPI (1)
      • 웹 (2)
        • Nginx (1)
      • 프로그래밍 언어 (29)
        • HTML (0)
        • CSS (0)
        • JavaScript (21)
        • Python (3)
        • Node.js (0)
        • TypeScript (4)
        • Java (1)
      • Today I learned (9)
      • 알고리즘 (9)
        • 백준 (0)
        • 프로그래머스 (8)
        • 개념 (1)
      • 티끌모아 태산 (5)
        • 하루에 영단어 하나씩 (5)
        • 독서 (0)
      • 시행착오 (3)
      • 데이터베이스 (2)
        • MySQL (0)
      • 컴퓨터 과학 (8)
        • 네트워크 (2)
        • 운영체제 (0)
        • 데이터베이스 (2)
        • 자료구조 (4)
      • 포트폴리오 (4)
        • JJINCAFE IN SEOUL (4)
        • CODEUNICORN (0)
      • 회고 (0)
      • CICD (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    배열
    django
    IP 주소
    iterable
    프로그래머스
    FastAPI
    스택
    컨테이너
    생활코딩
    typescript
    Til
    코딩테스트
    Kubernetes
    네트워크
    Docker
    Python
    조인
    모듈
    리눅스
    redis
    nestjs
    자바스크립트
    도커
    typeorm
    쿠버네티스
    mysql
    기초
    javascript
    레벨2
    Kubectl
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
rondeveloper
스택(Stack)
상단으로

티스토리툴바