Queue code

ChamChoi·2022년 1월 3일
0

class Empty(Exception): ### 왜 선언하는지?
pass

class ArrayQueue: ### 클래스로 잡아주는 이유는?
DEFAULT_CAPACITY = 10 # 기본 큐 크기
def init(self): # 빈 큐 생성
self._data = [None]*ArrayQueue.DEFAULT_CAPACITY # 데이터 관리 리스트
self._size = 0 # 큐에 저장된 데이터의 개수
self._front = 0 # 첫 번째 값의 인덱스
self._back = self._front + self._size - 1 # 마지막 값의 인덱스

def __len__(self): # 큐의 길이를 반환. 
    return self._size
    
def size(self):
    return self._size

def _resize(self, n):   # 큐가 가득 찼을 때 큐를 확장.
    old = self._data   # 기존 큐는 old 로 보냄.
    self._data = [None] *n   # 새 큐를 빈 것으로 생성.
    walk = self._front   # walk는 기존 큐의 첫 번째 인덱스
    for i in range(self._size):
        self._data[i] = old[walk] 
        # 새 큐의 첫 번째 인덱스를 기존 큐의 첫 인덱스와 매칭.
        walk = (walk +1 ) % len(old)  
        # 기존 큐의 인덱스를 증가시키되, 길이를 초과하면 처음으로 돌아옴.
    self._front = 0 # 새 큐의 첫 번째 인덱스는 0으로 초기화.
    
def empty(self):   # 큐가 비어있으면 True를 반환.
    if self._size == 0:
        return 1
    else:
        return 0    

def first(self):   # front의 요소를 제거하지 않고 반환.
    if empty():
        raise Empty("Queue is empty")
    return self._data[self._front]
    
def push(self, e):   # back에 요소를 추가.
    if self._size == len(self._data):   # 큐가 가득찼다면 큐의 크기를 두배로 늘려줌.
        self._resize(2 * len(self._data))
    avail = (self._front + self._size) % len(self._data)   
    # 새로운 값이 들어갈 인덱스에 마지막 값의 다음 인덱스를 큐의 크기로 나눈 나머지를 할당.
    self._data[avail]=e   # 새 인덱스에 데이터를 삽입
    self._size+=1  # 큐에 저장된 데이터 수를 증가.
    
def pop(self):
    if empty() == 1:
        return -1
    answer = self._data[self._front]   #맨 앞에 있는 값을 할당
    self._data[self._front] = None   # 맨 앞에 있는 값을 제거.
    self._front = (self._front+1)%len(self._data) # 다음 값을 맨 앞으로 가져옴. 
    # 이 때 큐의 길이로 나눈 나머지를 할당. 마지막 인덱스인 경우에도 큐를 확장하지 않고 0으로 돌아옴. 원형 리스트.
    self._size-=1
    return answer

def front(self): 
    if empty() == 1:
        return -1
    
    return self._data[self._front]   #맨 앞에 있는 값을 출력

def back(self): 
    if empty() == 1:
        return -1
    
    return self._data[self._back]   #맨 뒤에 있는 값을 출력

def numbers():
y=None
number = input("Enter a number ( to quit)")

# 2개 이상의 숫자를 받아야 한다는 제약조건을 제외함.
while number != "":
    try:
        x = int(number)
        if x > 0 and x < 10001:
            y = x
        else:
            print('>>> NOT a number! Ignored..')
            pass
    except ValueError:
        print('>>> NOT a number! Ignored..')
    number = input("Enter a number (<Enter key> to quit)")
return y

T=numbers()
CommandList = [ArrayQueue.push(), ArrayQueue.pop(), ArrayQueue.size(), ArrayQueue.empty(), ArrayQueue.front(), ArrayQueue.back()]

profile
microCT_applications

0개의 댓글