[Typescript] 단일 연결 리스트 Stack 구조 만들기

2021. 5. 8. 16:03·개발/Typescript
728x90

[ String 타입만 받는 Stack ]

interface Stack {
    readonly size: number;
    push(value: string): void;
    pop(): string;
}

type StackNode = {
    readonly value: string;
    readonly next?: StackNode;
}

class Stack_Impl implements Stack {
    private _size: number = 0;
    private head?: StackNode;

    constructor(private capacity: number) {}
    
    get size() { return this._size; }

    push(value: string) {
        if (this.capacity === this.size) { throw new Error(`This Stack is Full!`); } 
        const node: StackNode = { value, next: this.head };
        this.head = node;
        this._size++;
    }

    pop(): string {
        if(this.head == null) { throw new Error ('This Stack is Empty!'); }
        const node = this.head;
        this.head = node.next;
        this._size--;
        return node.value;
    }
}


const stack = new Stack_Impl(10);

for(let i = 1; i < 10; i++) {
    stack.push(`Stack ${i}`);
}

while (stack.size !== 0) {
  console.log(stack.pop());
}

stack.pop();

/*
[결과]

Stack 9
Stack 8
Stack 7
Stack 6
Stack 5
Stack 4
Stack 3
Stack 2
Stack 1

C:\Users\...\stack.ts:33
            throw new Error ('This Stack is Empty!');
                  ^
Error: This Stack is Empty!
*/

[문제]

  • 기본적으로 내장된 Array, push, pop를 사용하지 않고 단일 연결 리스트 구성의 Stack을 구현하여라.

[생각한 것 들]

  1. Stack 구조 만드는데 필요한 변수나 매서드들을 생각한 후 interface 생성.
  2. 배열 대신 사용할 스택 노드 타입 생성.
  3. constructor로 생성시 Stack의 크기(capacity)를 받아와 push와 pop의 Error 조건으로 사용.
  4. Stack Class 내부적으로 사용할 _size(node의 개수 파악 용도)와 head(노드의 value와 다음 node를 가리킴) 변수.

[의문점]

pop(): string {
        if(this.head == null) { throw new Error ('This Stack is Empty!'); }
        const node = this.head;
        this.head = node.next;
        this._size--;
        return node.value;
    }
  • pop 매서드의 Error조건을 만들시, 조건을 this.head === null 로 하면 node 타입이 optional로 파악되어 undefined가 될 가능성이 있어 오류가 발생함.
  • 그러나 조건이 this.head == null 일시, 타입이 StackNode로 고정됨.

조건이 this.head === null 일때..  

  • '=='는 동등 연산자이고 '==='는 일치 연산자 이다.
  • '=='는 값만 비교하지만, '==='는 값과 타입을 같이 비교한다.
  • 만약 '===' 을 쓰려고 한다면 null 대신 undefined를 사용하면 된다.

+ 제네릭을 이용한 모든 타입을 받는 Stack

interface Stack<T> {
    readonly size: number;
    push(value: T): void;
    pop(): T;
  }
  
  type StackNode<T> = {
    readonly value: T;
    readonly next?: StackNode<T>;
  };
  
  class StackImpl<T> implements Stack<T> {
    private _size: number = 0;
    private head?: StackNode<T>;
  
    constructor(private capacity: number) {}
    get size() {
      return this._size;
    }
    push(value: T) {
      if (this.size === this.capacity) {
        throw new Error('Stack is full!');
      }
      const node = { value, next: this.head };
      this.head = node;
      this._size++;
    }
    pop(): T {
      if (this.head == null) {
        throw new Error('Stack is empty!');
      }
      const node = this.head;
      this.head = node.next;
      this._size--;
      return node.value;
    }
  }
  
저작자표시 (새창열림)

'개발 > Typescript' 카테고리의 다른 글

[TS] 타입스크립트로 구현해 본 정렬 알고리즘 #2 (병합 정렬, 퀵 정렬)  (0) 2021.06.05
[TS] 타입스크립트로 구현해 본 정렬 알고리즘 #1 (버블 정렬, 선택 정렬, 삽입 정렬)  (1) 2021.05.19
[Dream Coding TS + OOP] 계획 및 목표  (0) 2021.03.21
Typescript 알아보기  (0) 2020.06.03
'개발/Typescript' 카테고리의 다른 글
  • [TS] 타입스크립트로 구현해 본 정렬 알고리즘 #2 (병합 정렬, 퀵 정렬)
  • [TS] 타입스크립트로 구현해 본 정렬 알고리즘 #1 (버블 정렬, 선택 정렬, 삽입 정렬)
  • [Dream Coding TS + OOP] 계획 및 목표
  • Typescript 알아보기
기짜낭
기짜낭
생각이 많지만, 지금 내가 해야할 것을 하자.
  • 기짜낭
    So tired
    기짜낭
    • 분류 전체보기 (199)
      • 개발 (11)
        • Javascript (19)
        • Typescript (5)
        • Canvas (8)
        • React (13)
        • C (3)
      • 활동 (63)
        • 개인 프로젝트 (33)
        • 나눔 서포터즈 3기 (9)
        • 멋쟁이 사자처럼 (7)
        • 0&1 C++ 자료구조 스터디 (0)
        • 제 9회 창업 아이디어톤 (3)
        • Poom (ZeroWasteShop) (3)
        • 해커톤 (2)
        • 우테코 프리코스 7기 (6)
      • 알고리즘 (27)
        • 알고리즘 정리 (5)
        • 백준 (18)
        • 프로그래머스 (4)
      • 강연 (7)
      • 독서 (18)
      • 회고 & 생각 (16)
        • 연간회고 (4)
      • 기타 (5)
  • 블로그 메뉴

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

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

    1주 1권
    에리카
    Erica
    프로젝트
    대학
    3기
    개념
    군대
    독서
    Javascript
    HTML
    타입스크립트
    독후감
    1주에 1권씩
    tutorial
    HTML5
    canvas
    react
    백준
    디자인
    ES6
    개발
    TypeScript
    우테코
    개발자
    프로그래밍
    한양대학교
    프론트엔드
    알고리즘
    CSS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
기짜낭
[Typescript] 단일 연결 리스트 Stack 구조 만들기
상단으로

티스토리툴바