
	                	                 
C++의 DsPriorityQueue 클래스는 우선순위 큐를 구현하기 위해 사용할 수 있습니다. 우선순위 큐는 우선순위가 가장 높은 원소를 제거하고 반환하는 것을 목표로 합니다.
우선순위가 동일한 원소가 여러 개 있는 경우, pop 메서드는 일반적으로 최소 힙 또는 최대 힙을 사용하여 구현됩니다. 최소 힙에서는 우선순위가 가장 낮은 원소를 제거하고 반환합니다. 최대 힙에서는 우선순위가 가장 높은 원소를 제거하고 반환합니다.
DsPriorityQueue 클래스는 일반적으로 최소 힙을 사용하여 구현됩니다. 따라서 우선순위가 동일한 원소가 여러 개 있는 경우, pop 메서드는 첫 번째 원소를 반환하고 제거합니다.
예를 들어, 우선순위가 동일한 원소가 여러 개 있는 경우 다음과 같은 상황이 발생할 수 있습니다.
- 원소 1: 우선순위 5
- 원소 2: 우선순위 5
- 원소 3: 우선순위 3
이 경우, pop 메서드는 우선순위가 가장 낮은 원소를 제거하고 반환합니다. 따라서 첫 번째 원소인 원소 3가 제거되고 반환됩니다.
#hostingforum.kr
cpp
#include 
#include 
class DsPriorityQueue {
public:
    void push(int priority, int value) {
        elements.push_back({priority, value});
        heapifyUp(elements.size() - 1);
    }
    int pop() {
        if (elements.empty()) {
            return -1; // 또는 예외를 발생시킵니다.
        }
        if (elements.size() == 1) {
            int result = elements[0].second;
            elements.pop_back();
            return result;
        }
        int result = elements[0].second;
        elements[0] = elements.back();
        elements.pop_back();
        heapifyDown(0);
        return result;
    }
private:
    struct Element {
        int priority;
        int value;
    };
    std::vector elements;
    void heapifyUp(int index) {
        if (index == 0) {
            return;
        }
        int parentIndex = (index - 1) / 2;
        if (elements[parentIndex].priority > elements[index].priority) {
            std::swap(elements[parentIndex], elements[index]);
            heapifyUp(parentIndex);
        }
    }
    void heapifyDown(int index) {
        int leftChildIndex = 2 * index + 1;
        int rightChildIndex = 2 * index + 2;
        int smallestIndex = index;
        if (leftChildIndex < elements.size() && elements[leftChildIndex].priority < elements[smallestIndex].priority) {
            smallestIndex = leftChildIndex;
        }
        if (rightChildIndex < elements.size() && elements[rightChildIndex].priority < elements[smallestIndex].priority) {
            smallestIndex = rightChildIndex;
        }
        if (smallestIndex != index) {
            std::swap(elements[index], elements[smallestIndex]);
            heapifyDown(smallestIndex);
        }
    }
};
int main() {
    DsPriorityQueue pq;
    pq.push(5, 1);
    pq.push(5, 2);
    pq.push(3, 3);
    int result = pq.pop();
    std::cout << "Pop: " << result << std::endl;
    return 0;
}
이 예제 코드에서는 DsPriorityQueue 클래스를 구현하고 우선순위가 동일한 원소가 여러 개 있는 경우 pop 메서드의 동작을 보여줍니다.
2025-05-19 09:47