[자료구조&알고리즘] 큐(Queue)

cojet·2022년 10월 20일
0

자료구조&알고리즘

목록 보기
6/16

큐(Queue)

First In Fist Out(선입선출) 개념을 가진 선형 자료구조 입니다.
영화 예매를 위해 줄을 설때 먼저 선사람이 먼저 예매를 할 수 있다고 생각하면 쉽습니다.
Linear QueueCircular Queue가 존재합니다.

선형 큐(Linear Queue)

선형 큐는 배열연결 리스트로 구현이 가능합니다

배열

class Queue {
  constructor() {
    this.queue = [];
    this.front = 0;
    this.rear = 0;
  }

  enqueue(value) {
    this.queue[this.rear++] = value;
  }

  dequeue() {
    const value = this.queue[this.front];
    delete this.queue[this.front];
    this.front++;
    return value;
  }
  // queue의 가장 앞 get
  peek() {
    return this.queue[this.front];
  }

  size() {
    return this.rear - this.front;
  }
}

const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
console.log(queue); // Queue { queue: [ 1, 2, 4 ], front: 0, rear: 3 }
console.log(queue.dequeue()); // 1
queue.enqueue(8);
console.log(queue.size()); // 3
console.log(queue.peek()); // 2
console.log(queue.dequeue()); // 2

연결 리스트

class Node {
  constructor(value) {
    this.value = value;
    this.next = null;
  }
}

class Queue {
  constructor() {
    this.head = null;
    this.tail = null;
    this.size = 0;
  }

  enqueue(newValue) {
    const newNode = new Node(newValue);
    if (this.head === null) {
      this.head = this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
    this.size++;
  }

  dequeue() {
    const value = this.head.value;
    this.head = this.head.next;
    this.size--;
    return value;
  }

  peek() {
    return this.head.value;
  }
}

const queue = new Queue();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
console.log(queue.dequeue()); // 1
queue.enqueue(8);
console.log(queue.size); // 3
console.log(queue.peek()); // 2
console.log(queue.dequeue()); // 2

주의!

const queue = [1, 2, 3];
queue.push(4);
const value = queue.shift();
console.log(value); // 1

다음과 같이 shift()로 queue를 간단하게 구현가능하지만 shift()는 O(n)의 시간복잡도를 갖습니다.

원형 큐(Circular Queue)

원형 큐는 Front와 Rear가 이어져있는 큐이고 연결 리스트로 구현했을 때
이점이 없기때문에 배열로 구현해 보도록 하겠습니다.

class Queue {
  constructor(maxSize) {
    this.maxSize = maxSize;
    this.queue = [];
    this.front = 0;
    this.rear = 0;
    this.size = 0;
  }

  enqueue(value) {
    if (this.isFull()) {
      console.log("Queue is full!");
      return;
    }
    this.queue[this.rear] = value;
    this.rear = (this.rear + 1) % this.maxSize;
    this.size++;
  }

  dequeue() {
    const value = this.queue[this.front];
    delete this.queue[this.front];
    this.front = (this.front + 1) % this.maxSize;
    this.size--;
    return value;
  }

  isFull() {
    return this.size === this.maxSize;
  }

  peek() {
    return this.queue[this.front];
  }
}

const queue = new Queue(4);
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(4);
queue.enqueue(8);
queue.enqueue(16); // Queue is full!
console.log(queue.dequeue()); // 1
console.log(queue.dequeue()); // 2
console.log(queue.size); // 2
console.log(queue.peek()); // 4
queue.enqueue(16);
queue.enqueue(32);
console.log(queue.isFull()); // true

0개의 댓글