큐 구현하기

SHL·2023년 5월 15일
0

Data Structure

목록 보기
6/6

Stack Python

class Queue:
    def __init__(self):
        self.items = []
    
    def push(self, value):
        self.items.append(value)
        
    def pop(self):
        if not self.items:
            return None
        return self.items.pop(0)

Queue로 Array 구현하기

class QueueArray:
    def get(self, idx):
        if idx >= self.size:
            raise Exception("Out of Index!")
        #예외처리로 꼬임 방지

        for i in range(idx):
            self.queue.push(self.queue.pop())
        #for 문으로 해당위치가맨 앞에 오도록

        value = self.queue.pop()
        
        self.queue.push(value)
        
        for i in range(self.size-idx-1):
            self.queue.push(self.queue.pop())
            
        return value
        
    def set(self, idx, value):
        if idx >= self.size:
            raise Exception("Out of Index!")
            
        for i in range(idx):
            self.queue.push(self.queue.pop())
        
        self.queue.pop()
        self.queue.push(value)
        
        for i in range(self.size-idx-1):
            self.queue.push(self.queue.pop())
        
    def __init__(self, size):
        self.size = size
        self.queue = Queue()
        for i in range(size):
            self.queue.push(None)

Queue Linked list

class QueueList:
    def move_next(self):
        if self.flag == self.size:
            raise Exception("End of List!")
        #size와 flag로 예외처리

        self.queue.push(self.queue.pop())
        self.flag +=1
        
    def get(self):
        value = self.queue.pop()
        self.queue.push(value)
        
        for i in range(self.size-1):
            self.queue.push(self.queue.pop())
        
        return value
        # 맨 앞 인덱스를 current로 가정

    def add(self, value):
        check = self.queue.pop()
        
        if check == None:
            self.queue.push(value)
            self.flag +=1
            self.size +=1
						#빈 큐면 새로운 값을 넣고 마무리
            return
        
        self.queue.push(check)
        self.queue.push(value)
        for i in range(self.size):
            self.queue.push(self.queue.pop())
        # 순서 보정 
        self.size +=1
        self.flag +=1
        
    def delete(self):
        self.queue.pop()
        self.size -=1
        if self.flag == 1:
            return
				#첫번째 인덱스 다른게 수행
        
        self.flag -=1
        
        for i in range(self.size-1):
            self.queue.push(self.queue.pop())
				#이외는 하나앞의 인덱스로 연결
        
    def move_front(self):
        for i in range(self.size - self.flag + 1):
            self.queue.push(self.queue.pop())
        
        self.flag = 1
        
    def __init__(self):
        self.queue = Queue()
        self.size = 0
        self.flag = 0
		#size 와 현위치를 채크해서 pop과 push 횟수 결정

Queue로 Stack 구현하기

class QueueStack:
    def push(self, value):
        self.queue1.push(value)
        
    def pop(self):
        count = 0
        while True:
            value1 = self.queue1.pop()
            if value1 == None:
                break
            self.queue2.push(value1)
            count += 1
            
        for i in range(count -1):
            self.queue1.push(self.queue2.pop())
        
        value = self.queue2.pop()
        
        return value
    
    def __init__(self):
        self.queue1 = Queue()
        self.queue2 = Queue()

두개의 큐를 만들어 번갈아가면서 스택의 역할을 하도록 리버스 시킴

0개의 댓글