끄적끄적

자료구조 개념 정리 - 스택,큐,덱 알아보기 본문

Computer Science/DataStructure

자료구조 개념 정리 - 스택,큐,덱 알아보기

mashko 2019. 6. 17. 23:27
반응형

우리가 프로그래밍을 하며 선형구조에서
제일 많이 사용하는 자료구조 중 하나라고 할 법한 스택,큐,덱에 대해 알아보려 합니다.
제일 보편적이고 제일 많이 질문이 오고가는 내용이며, 필수적으로 알아야 할 내용인데요.
사실 이미 다 알고 계실 내용일 수도 있어요.
그만큼 많이 사용하는 내용입니다.

스택(Stack)
스택은 (Last in FirstOut) 이라고 많이 배우죠.
기억나시나요? 줄여서 LIFO라는말 많이 들어 보셨을꺼에요. 스택을 가르키는 말입니다.
간단하게 이해하자면 말의 뜻처럼 쌓는다는걸 뜻 합니다.
코드로 이해해보죠.

function Stack() {
    this.datas = new Array();
}

Stack.prototype.push = function(data) {
    this.datas.push(data);
}
Stack.prototype.pop = function() {
    return this.datas.pop();
}

const stack = new Stack();

stack.push(1);
stack.push(2);
console.log(stack.pop()); // 2
console.log(stack.datas); // [1]

위와 같이 코드를 작성하고 실행을 해보시면 첫번째 콘솔에 2가 찍히고 두번째 콘솔에 [1] 가 찍히실 꺼에요.
배열에 있는 데이터를 컨트롤 할때 많이 쓰는 코드이기에 친숙하신 분들도 있으실꺼에요.
이처럼 스택은 마지막에 들어와서 그 반대로 값이 첫번째로 빠져나가는 구조입니다.

위에 문법이 조금 생소하신 분들이 있으실지 모르니 다른 방식으로 예제를 하나 더 보시죠.

class Stack {
    constructor() {
        this.datas = new Array();
    }

    push(data) {
        this.datas.push(data);
    }
    pop() {
        return this.datas.pop();
    }
}

const stack = new Stack();

stack.push(1);
stack.push(2);
console.log(stack.pop()); // 2
console.log(stack.datas); // [1]

결과는 같습니다.
중요하지 않은 것 같지만 중요한 개념입니다.

큐(Queue)
큐는 FIFO(First in First Out)으로 처음 들어온 노드가 첫번째로 나간다는 뜻입니다.
백문이 불여일견 코드로 이해하죠.
오리지널을 주력으로 하시는 분들을 위해 마찬가지로 프로토타입으로 먼저 작성하죠.

function Queue() {
    this.datas = new Array();
}

Queue.prototype.enqueue = function(data) {
    this.datas.push(data);
}
Queue.prototype.dequeue = function() {
    return this.datas.shift();
}

const queue = new Queue();

queue.enqueue(1);
queue.enqueue(2);
console.log(queue.dequeue()); // 1
console.log(queue.datas); // [2]

아까와는 다른 값이 나왔죠?
그리고 데이터를 넣었던 순서와 결과 값을 자세히 봅시다.
처음 넣었던 값이 shift를 통해 먼저 없어집니다. 그리고 [2]가 찍힙니다. 이게 라는 자료구조입니다.
클래스 문법으로 한번 다시 보죠

class Queue {
    constructor() {
        this.datas = new Array();
    }

    enqueue(data) {
        this.datas.push(data);
    }
    dequeue() {
        return this.datas.shift();
    }
}

const queue = new Queue();

queue.enqueue(1);
queue.enqueue(2);
console.log(queue.dequeue()); // 1
console.log(queue.datas); // [2]

위와 결과는 같습니다.
굉장히 많이 쓰는 개념 중 하나이기에 숙지 하시면 도움이 될 꺼에요.

덱(Deque)
덱은 스택과 큐의 개념이 합해진 것이라 보면 이해하기 쉽습니다.
양쪽 끝에서 데이터를 넣고 뺄 수 있는 구조로 코드로 보는게 더 이해하기 편하시겠죠?
코드로 봅시다.

function Deque() {
    this.datas = new Array();
}

Deque.prototype.push = function(data) {
    this.datas.push(data);
}
Deque.prototype.pop = function() {
    return this.datas.pop();
}
Deque.prototype.shift = function() {
    return this.datas.shift();
}
Deque.prototype.unshift = function(data) {
    this.datas.unshift(data);
}

const deque = new Deque();

deque.push(1);
deque.push(2);
console.log(deque.shift()); // 2
deque.unshift(3);
console.log(deque.pop()); // 1

이런식으로 스택과 큐의 개념을 합쳐서 사용하는 것을 데크형태라고 합니다.
위와같이 자바스크립트 내장 메서드에 이미 사용하기 쉽게 제공이 되어 있어 개념과 내용 숙지만 잘 되어 있어도 많은 도움이 될꺼에요.
마지막으로 클래스형태의 코드를 짜고 끝내도록 하죠.

class Deque {

    constructor() {
        this.datas = new Array();
    }

    push(data) {
        this.datas.push(data);
    }
    pop() {
        return this.datas.pop();
    }
    shift() {
        return this.datas.shift();
    }
    unshift(data) {
        this.datas.unshift(data);
    }
}

const deque = new Deque();

deque.push(1);
deque.push(2);
console.log(deque.shift()); // 2
deque.unshift(3);
console.log(deque.pop()); // 1

자료구조의 선형구조에서 가장 기본적인 자료구조형태의 스택과 큐,데크에 대해 알아보았습니다.
우리가 익히 사용하는 것들이라 이론적으로 그리고 이러한 메서드 및 개념으로 조금 더 유연한 개발을 하시길 바랍니다.

반응형
Comments