[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)
  • 블로그 메뉴

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

  • 공지사항

    • ※ 예전 블로그
  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바