자료구조&알고리즘

자료구조 -Stack, Queue에 대한 공부를 마치며

배트리버 2023. 5. 10. 13:01

오늘은 자료구조 중 Stack 과 Queue에 대해 학습했다 . 데이터를 효과적으로 관리하기 위해 자료구조가 쓰이고 데이터의 특징을 잘 분석하고 사용해야 자료구조를 잘 활용할 수 있다. 사실 대학교를 다니며 귀에 딱지가 지도록 자료구조에 대해 배웠었는데 그 때에는 자료구조를 왜 써야하는지 크게 와닿지 않았던 것 같다 .  하지만 오늘 다시 복습을 하면서 자료구조의 필요성에 대해 깨달은 것 같다 !! ㅎㅎ 

 

Stack ?
데이터를 순서대로 쌓는 자료구조 
입력과 출력이 하나의 방향, 스택의 최상단에서만 이루어지는 제한적 접근
LIFO (Last In First Out) 또는 FILO (First In Last Out) 
데이터를 삽입 ( Push)
데이터를 추출 ( POP)

예 ) 브라우저의 뒤로가기 앞으로가기 기능 
새로운 페이지 접속 시 현재 페이지를 이전 스택에 보관  -> 뒤로 가기 버튼을 눌러 이전 페이지로 돌아갈 때에는 현재 페이지를 다음 스택에 보관하고 이전 스택에서 POP -> 앞으로 가기 버튼을 눌러 방문한 페이지로 이동할 때에는 다음 스택에서 POP 

https://www.cs.usfca.edu/~galles/visualization/StackArray.html

 

Array Stack Visualization

 

www.cs.usfca.edu

Stack을 시각적으로 볼 수 있는 사이트 

 

Queue?
데이터를 삽입 시 큐의 끝에서 (tail) 데이터를 제거 시 큐의 맨 앞에서 (head)
Stack과 반대되는 개념으로 먼저 삽입한 데이터가 먼저 나오는 FIFO 혹은 LILO
데이터가 입력된 순서대로 처리할 때 주로 사용 
예 ) 프린터에서 문서 출력 
출력 버튼 클릭 시 인쇄 작업 큐에 삽입 -> 큐에 들어온 순서대로 인쇄 

https://www.cs.usfca.edu/~galles/visualization/QueueArray.html

 

Array Queue Visualization

 

www.cs.usfca.edu

queue를 시각적으로 볼 수 있는 사이트 

 

Stack 구현 

class Stack {
  constructor() {
    this.storage = {};
    this.top = -1; // 스택의 가장 상단을 가리키는 포인터 변수를 초기화 합니다.
  }

  size() {
    return this.top + 1;
  }

	// 스택에 데이터를 추가 할 수 있어야 합니다.
  push(element) {
    this.top += 1;
    this.storage[this.top] = element;
  }
	
	// 가장 나중에 추가된 데이터가 가장 먼저 추출되어야 합니다.
  pop() {
    // 빈 스택에 pop 연산을 적용해도 에러가 발생하지 않아야 합니다
    if (this.size()<=0) {
      return ;
    }

    const result = this.storage[this.top];
    delete this.storage[this.top];
    this.top -= 1;
    
    return result;
  }
}

 

Queue 구현 

class Queue {
  constructor() {
    this.storage = {};
    this.front = 0;
    this.rear = 0;
  }

  size() {
    return this.rear - this.front 
  }
	
	// 큐에 데이터를 추가 할 수 있어야 합니다.
  enqueue(element) {
    this.storage[this.rear] = element;
    this.rear += 1;
  }
	
	// 가장 먼저 추가된 데이터가 가장 먼저 추출되어야 합니다.
  dequeue() {
    // 빈 큐에 dequeue 연산을 적용해도 에러가 발생하지 않아야 합니다
    if (this.size() <=0) {
      return;
    }

    const result = this.storage[this.front];
    delete this.storage[this.front];
    this.front += 1;

    return result;
  }
}