Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 스택(Stack) 자료구조 구현하는 방법

스택(Stack)은 LIFO(Last In, First Out), 즉 '나중에 들어간 요소가 먼저 나오는' 방식으로 동작하는 대표적인 선형 자료구조입니다. 데이터의 삽입과 삭제가 한쪽 끝(꼭대기, top)에서만 이루어지며, 이를 JavaScript에서는 배열과 클래스를 활용해 손쉽게 구현할 수 있습니다.

이번 글에서는 HTML과 JavaScript를 함께 사용해 스택을 직접 구현하고, 브라우저 화면에서 Push(삽입), Pop(삭제), Display(출력) 연산을 실습해 보겠습니다.

전체 예제 코드

아래 코드는 입력 필드와 버튼을 통해 스택 연산을 수행할 수 있는 완전한 웹 페이지 예제입니다.

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<style>
    body {
        font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;
    }
    .result {
        font-size: 18px;
        font-weight: 500;
        color: blueviolet;
    }
    button {
        padding: 6px;
        margin: 4px;
    }
</style>
</head>
<body>
<h1>JavaScript 스택 구현</h1>
<div class="result"></div>
<br />
<input type="text" class="stackPush" /><button class="pushBtn">Push</button>
<button class="popBtn">Pop</button>
<button class="Btn">Display</button>
<h3>위 버튼을 클릭하여 스택 연산을 실행해 보세요</h3>
<script>
    let resEle = document.querySelector(".result");
    let BtnEle = document.querySelector(".Btn");
    let pushBtnEle = document.querySelector(".pushBtn");
    let popBtnEle = document.querySelector(".popBtn");
    class Stack {
        constructor() {
            this.items = [];
            this.top = 0;
        }
    }
    Stack.prototype.push = function (ele) {
        this.items[this.top] = ele;
        this.top += 1;
    };
    Stack.prototype.pop = function () {
        if (this.top === 0) {
            return "Underflow: no more elements to delete";
        }
        tempNum = this.items[this.top - 1];
        this.items.length -= 1;
        return tempNum;
    };
    Stack.prototype.display = function () {
        if (this.top == 0) {
            return "Stack is empty";
        }
        for (let i = 0; i < this.top; i++) {
            resEle.innerHTML += this.items[i] + " , ";
        }
    };
    let stack1 = new Stack();
    BtnEle.addEventListener("click", () => {
        resEle.innerHTML = "";
        stack1.display();
    });
    pushBtnEle.addEventListener("click", () => {
        let ele = document.querySelector(".stackPush").value;
        resEle.innerHTML = ele + " is pushed to the stack";
        stack1.push(ele);
    });
    popBtnEle.addEventListener("click", () => {
        resEle.innerHTML = stack1.pop() + " is popped from the stack";
    });
</script>
</body>
</html>

코드 설명

핵심 로직을 간단히 살펴보면 다음과 같습니다.

1. Stack 클래스 정의

생성자에서 요소를 저장할 items 배열과 현재 위치를 가리키는 top 인덱스를 초기화합니다. top은 스택에 저장된 요소의 개수이자 다음 요소가 들어갈 위치를 의미합니다.

2. push() — 요소 삽입

top 위치에 새 요소를 추가한 뒤 top 값을 1 증가시킵니다. 시간 복잡도는 O(1)입니다.

3. pop() — 요소 삭제

스택이 비어 있으면 언더플로(Underflow) 메시지를 반환하고, 그렇지 않으면 맨 위 요소를 꺼낸 후 배열 길이를 줄여 해당 요소를 제거합니다.

4. display() — 전체 출력

스택이 비어 있으면 '비어 있음' 메시지를 반환하고, 그렇지 않으면 모든 요소를 순서대로 화면에 표시합니다.

실행 결과

페이지를 열면 아래와 같은 초기 화면이 나타납니다.

JavaScript로 스택(Stack) 자료구조 구현하는 방법

입력 필드에 값을 넣고 'Push' 버튼을 클릭하면 해당 값이 스택에 추가됩니다.

JavaScript로 스택(Stack) 자료구조 구현하는 방법

'Pop' 버튼을 클릭하면 스택의 맨 위 요소가 제거되고 결과가 표시됩니다.

JavaScript로 스택(Stack) 자료구조 구현하는 방법

스택에 요소가 있는 상태에서 'Display' 버튼을 클릭하면 현재 저장된 모든 요소를 확인할 수 있습니다.

JavaScript로 스택(Stack) 자료구조 구현하는 방법

마무리

이처럼 JavaScript의 배열과 프로토타입 메서드를 활용하면 스택 자료구조를 간단하게 구현할 수 있습니다. 스택은 함수 호출 관리, 실행 취소(Undo) 기능, 괄호 검사 등 다양한 곳에서 활용되므로 기본 개념과 구현 방법을 잘 익혀두면 큰 도움이 됩니다.