Stack & Queue

Hyeseong·2021년 3월 20일
0

Array, 배열은 JavaScript, Python 을 넘어서 모든 프로그래밍 언어에서 가장많이 사용되는 자료구조 입니다.

  • 배열의 특징은 다음과 같습니다.
    1. 순차적으로 데이터를 저장한다.
    2. index 로 배열의 값에 접근하기 때문에 속도가 빠르다.
  • 따라서, 관련있고 연속된 데이터를 다룰 때 배열을 사용한다는점
  • 그만큼 자료구조는 문제해결의 중심에 있습니다.
  • 오늘은 배열과 밀접한 관련이 있는 StackQueue에 대해서 배워보도록 하겠습니다.

> Stack


LIFO (Last In First Out)

마지막으로 들어온 데이터가 가장 먼저 나간다.

스택이라는 자료구조는 우리 삶에 사실 엄청나게 밀접합니다. 위의 그림에서도 볼 수 있듯이 맛있는 아이스크림의 콘 위에 쌓이는 것도 스택, 읽을 책들을 쌓아두는 것도 스택입니다.

아이스크림 한 스쿱, 읽을 책도 결국 데이터가 아닌가요? 우리는 데이터와 함께 살아갑니다.

Q. 그렇다면 스택의 특징은 무엇일까요?

  • 가장 최근에 쌓인 데이터가 먼저 처리된다.

컴퓨터 세계 속 스택

이 특징으로 인해 컴퓨터의 세계에서는 어떻게 스택이 사용될까요? 몇가지 예를 살펴보겠습니다.

  • 개발자들의 최대 커뮤니티 Stack OverFlow

  • 브라우저의 History

  • 터미널 cd(Change Directory), pwd (현재경로를 알아보는) 명령어

  • 함수 실행 콜 스택


> Queue


FIFO (First In First Out)

처음으로 들어온 데이터가 가장 먼저 나간다.

큐 라는 자료구조도 우리의 일상생활에서 떼려야 뗄 수 없습니다. 위의 사진만 봐도 알겠죠?

우리는 마트에서 장을 볼 때, 버스를 기다릴 때, 놀이공원에서 줄을 설 때, 모두 큐에 들어간 데이터와 같습니다. 큐는 공평하죠. 왜냐하면 가장 먼저 줄을 선 사람이 가장 먼저 계산대를 거치고, 버스에 타고, 놀이기구에 탑승합니다.

Q. 그렇다면 큐의 특징은 무엇일까요?

  • 가장 먼저 들어온 데이터가 먼저 처리된다.

컴퓨터 세계 속 큐

  • 프린터 작업 스케쥴러

  • JavaScript 비동기 처리 (ex. DOM Event, setTimeout, HTTP 통신을 하는 fetch 함수 등..)

스택 구현 예제


#stack.py**

    ```python
   class Stack:
    def __init__(self):
        self.state = []

    def push(self, data):
			# 데이터를 스택에 push 하는 것을 구현 해 주세요
            return self.state.append(data)

    def pop(self):
			# 데이터를 스택에서 pop 해서 그 값을 리턴하도록 구현 해 주세요
            value = self.state.pop()
            if value is not None:
                return value
            else:
                print('Stack is empty.')

    def getPeak(self):
			# 스택의 최상위 값을 리턴하도록 구현 해 주세요
        if self.state:
            return self.state[-1]
        else:
            print('Stack is empty.')
    
    def isEmpty(self):
        # 데이터가 stack에 있는지 유무 파악
        return not bool(self.state)
    
    def size(self):
        # stack에 몇개의 값이 있는지 확인
        return len(self.state)

    def __repr__(self):
        return repr(self.state)

if __name__ == '__main__':
    stack = Stack()
    print('스택이 비었나요?: {}'.format(stack.isEmpty()))
    print('스택에 숫자 0-9를 추가합니다.')
    for i in range(10):
        stack.push(i)
    print('스택 크기 : {0}'.format(stack.size()))
    print('size: {}'.format(stack.size()))
    print('getPeak: {}'.format(stack.getPeak()))
    print('pop: {}'.format(stack.pop()))
    print('getPeak: {}'.format(stack.getPeak()))
    print('Empty??? {}'.format(stack.isEmpty()))
    print(stack)
스택이 비었나요?: True
스택에 숫자 0-9를 추가합니다.
스택 크기 : 10
size: 10
getPeak: 9
pop: 9
getPeak: 8
Empty??? False
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

큐 구현 예제

class Queue:
   def __init__(self):
       self.state = []

   def enqueue(self, data):
			# queue 뒤쪽에 항목을 삽입합니다.
       self.state.insert(0, data)

   def dequeue(self):
			# Queue앞 쪽의 항목을 반환하고, 제거
       value = self.state.pop()
       if value is not None:
           return value
       else:
           print('Queue is empty.')

   def getPeak(self):
			# 스택의 최상위 값을 리턴하도록 구현 해 주세요
       if self.state:
           return self.state[-1]
       else:
           print('Stack is empty.')
   
   def isEmpty(self):
       # 데이터가 stack에 있는지 유무 파악
       return not bool(self.state)
   
   def size(self):
       # stack에 몇개의 값이 있는지 확인
       return len(self.state)

   def __repr__(self):
       return repr(self.state)

if __name__ == '__main__':
   queue = Queue()
   print('스택이 비었나요?: {}'.format(queue.isEmpty()))
   print('스택에 숫자 0-9를 추가합니다.')
   for i in range(10):
       queue.enqueue(i)
   print('스택 크기 : {0}'.format(queue.size()))
   print('size: {}'.format(queue.size()))
   print('getPeak: {}'.format(queue.getPeak()))
   print('pop: {}'.format(queue.dequeue()))
   print('getPeak: {}'.format(queue.getPeak()))
   print('Empty??? {}'.format(queue.isEmpty()))
   print(queue)
Queue 비었나요?: True
Queue 숫자 0-9를 추가합니다.
Queue크기 : 10
size: 10
getPeak: 0
pop: 0
getPeak: 1
Empty??? False
[9, 8, 7, 6, 5, 4, 3, 2, 1]
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글