정현수
현수 세상
정현수
전체 방문자
오늘
어제
반응형
  • 분류 전체보기 (267)
    • NEXTSTEP 자바스크립트 클린코드 2기 (1)
    • 우테코 4기 (6)
    • 회고록 (5)
    • 개발지식 (6)
    • React (3)
      • React Clone Coding (3)
    • React Native (2)
    • Kubernetes & Docker (36)
      • 궁금한 것 (13)
    • Flutter (2)
    • 알고리즘 (168)
      • 프로그래머스 1단계 (27)
      • 프로그래머스 2단계 (37)
      • 백준 (98)
      • 이론 (6)
    • 자료구조 (3)
    • 유튜브 (1)
    • 책 읽자 (1)
    • 취업준비 (1)
    • 대내 활동 (31)
      • 2022년 겨울방학 알고리즘 특강 (0)
      • 2020년 여름방학 모각코 (13)
      • 2020년 겨울방학 모각코 (13)
      • 웹프로그래밍 상상튜터링 (5)

인기 글

최근 글

공지사항

  • 블로그 이동

태그

  • 이코테
  • 모각코
  • 리액트
  • Jenkins
  • 개발지식
  • 자바스크립트
  • React
  • docker
  • Deployment
  • Kubernetes
  • 파이썬
  • image run
  • 공식문서
  • 프로그래머스
  • 쿠버네티스
  • programmers
  • 디플로이먼트
  • replicaset
  • image pull
  • flutter
  • javascript
  • NodePort
  • 레플리카셋
  • mysql
  • kubelet
  • 우테코
  • 백준
  • 그리디
  • 노드
  • 알고리즘

최근 댓글

블로그 메뉴

  • 홈

티스토리

hELLO · Designed By 정상우.
정현수

현수 세상

[자료구조] 자바스크립트로 스택(Stack) 구현하기
자료구조

[자료구조] 자바스크립트로 스택(Stack) 구현하기

2022. 1. 18. 16:40
반응형

스택(Stack)

블록을 아래에서 부터 위로 쌓아 올리는 구조를 가지고 있습니다. 가장 마지막에 삽입한 데이터를 가장 먼저 사용하게 됩니다.

이러한 자료구조의 특성을 LIFO(Last-in, First-out)라고 합니다.

 

출처: https://velog.io/@sbinha/%EC%8A%A4%ED%83%9D-%ED%81%90

 

시간 복잡도
삽입 O(1)
삭제 O(1)
검색 O(n)

삽입과 삭제는 맨 위에서 모두 진행이 되기 때문에 O(1)의 시간복잡도를 가집니다.

검색은 스택안의 데이터를 찾을 때 까지 진행되기 때문에 O(n)의 시간복잡도를 가지게 됩니다.

자바스크립트 코드

스택은 자바스크립트에서 쉽게 구현할 수 있습니다.

자바스크립트 내장 메소드인 pop()과 push()를 이용하면 됩니다.

 

자바스크립트에서 배열을 하나 생성하고,

아이템을 넣고 싶다면 push(아이템)

아이템을 빼고 싶다면 pop()

을 해주면 됩니다.

 

배열로 구현

간단히 10만개의 아이템을 넣고 빼는 시간을 측정해봤습니다.

배열로 구현했을 때입니다.

const iter = 100000;
let start = new Date();
let end = new Date();

const arr = [];

start = new Date();
for (let i = 0; i < iter; i += 1) arr.push(i);
end = new Date();

console.log(`push ${iter}: ${end - start}ms`);

start = new Date();
for (let i = 0; i < iter; i += 1) arr.pop();
end = new Date();

console.log(`pop ${iter}: ${end - start}ms`);

push()는 7ms, pop()은 2ms로 조금 차이가 납니다.

 

노드로 구현

const iter = 100000;
let start = new Date();
let end = new Date();

class Node {
	constructor(item) {
		this.item = item;
		this.prev = null;
	}
}

class Stack {
	constructor() {
		this.top = null;
		this.size = 0;
	}

	push(item) {
		const node = new Node(item);
		if (!this.size) this.top = node;
		else {
			node.prev = this.top;
			this.top = node;
		}
		this.size += 1;
	}

	pop() {
		if (!this.size) return null;
		
		const pop = this.top;
		this.top = this.top.prev;
		this.size -= 1;
		return pop.item;
	}
}

const stack = new Stack();

start = new Date();
for (let i = 0; i < iter; i += 1) stack.push(i);
end = new Date();

console.log(`stack push ${iter}: ${end - start}ms`);

start = new Date();
for (let i = 0; i < iter; i += 1) stack.pop();
end = new Date();

console.log(`stack pop ${iter}: ${end - start}ms`);

혹시나 차이가 있을까해서 노드로 직접 넣고 빼는 스택 클래스를 만들어보았습니다.

결과는 아래와 같습니다!

 

무슨이유에서인지 제가 구현한 스택보다 배열을 이용한 스택이 조금 더 빠른 것을 볼 수 있습니다.

 

자바스크립트에서 스택을 구현할 때에는 배열로 하는 것이 좋아보입니다.

 

추천 문제

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

 

반응형

'자료구조' 카테고리의 다른 글

[자료구조] 자바스크립트로 큐(Queue) 구현하기  (0) 2022.02.07
[파이썬] 우선순위 큐(Priority Queue), 힙(Heap)  (0) 2021.01.07
    정현수
    정현수
    깃허브 : https://github.com/junghyeonsu 개인 블로그 : https://junghyeonsu.com/ (양질의 글을 올리려고 항상 노력합니다.)

    티스토리툴바