91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

c語言priority_queue的用法是什么

小億
87
2023-11-23 17:40:16
欄目: 編程語言

在C語言中,要使用優先隊列(priority queue),你需要使用堆(heap)數據結構來實現。堆是一種特殊的二叉樹,具有以下性質:

  1. 父節點的值總是大于等于(或小于等于)子節點的值,其中大根堆要求父節點值大于等于子節點,小根堆要求父節點值小于等于子節點。
  2. 堆總是一棵完全二叉樹,即除了最后一層外,其他層都是滿的,并且最后一層的節點都靠左排列。

在C語言中,可以使用數組來表示二叉堆。對于大根堆,數組中的每個元素都比其子節點的值要大;對于小根堆,數組中的每個元素都比其子節點的值要小。

以下是C語言中使用優先隊列的一般步驟:

  1. 定義一個堆的結構體,包含一個數組和一個變量表示當前堆中元素的數量。
#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int size;
} PriorityQueue;
  1. 實現堆的一些基本操作,如插入元素、刪除堆頂元素等。這些操作需要保持堆的性質(父節點的值大于等于子節點)。
void insert(PriorityQueue* queue, int value) {
    if (queue->size >= MAX_SIZE) {
        printf("Priority queue is full.\n");
        return;
    }

    // 插入新元素到堆的最后
    int i = queue->size;
    queue->data[i] = value;

    // 調整堆,確保滿足堆的性質
    while (i > 0 && queue->data[i] > queue->data[(i - 1) / 2]) {
        // 交換當前節點和父節點的值
        int temp = queue->data[i];
        queue->data[i] = queue->data[(i - 1) / 2];
        queue->data[(i - 1) / 2] = temp;
        i = (i - 1) / 2;  // 更新當前節點的索引
    }

    queue->size++;  // 更新堆的大小
}

int deleteMax(PriorityQueue* queue) {
    if (queue->size == 0) {
        printf("Priority queue is empty.\n");
        return -1;  // 表示空值或錯誤
    }

    int max = queue->data[0];  // 保存堆頂元素
    queue->size--;  // 更新堆的大小

    // 將最后一個元素移動到堆頂
    queue->data[0] = queue->data[queue->size];

    // 調整堆,確保滿足堆的性質
    int i = 0;
    while (2 * i + 1 < queue->size) {
        int left = 2 * i + 1;  // 左子節點的索引
        int right = 2 * i + 2;  // 右子節點的索引
        int largest = i;  // 最大值的索引

        // 找到較大的子節點
        if (left < queue->size && queue->data[left] > queue->data[largest]) {
            largest = left;
        }
        if (right < queue->size && queue->data[right] > queue->data[largest]) {
            largest = right;
        }

        if (largest == i) {
            break;  // 已經滿足堆的性質,退出循環
        }

        // 交換當前節點和較大子節點的值
        int temp = queue->data[i];
        queue->data[i] = queue->data[largest];
        queue->data[largest] = temp;

        i = largest;  // 更新當前節點的索引
    }

    return max;
}
  1. 使用優先隊列的代碼示例:
int main() {
    PriorityQueue queue;
    queue.size = 0;

    insert(&queue, 5);
    insert

0
宝坻区| 拜城县| 兴和县| 通渭县| 宜都市| 大渡口区| 美姑县| 佛坪县| 昌都县| 镇康县| 平顶山市| 罗山县| 汪清县| 西青区| 南部县| 云霄县| 奉化市| 旬邑县| 金溪县| 伊宁市| 余庆县| 平陆县| 大埔县| 兰州市| 正宁县| 额尔古纳市| 沙洋县| 治多县| 满洲里市| 岱山县| 蒙山县| 疏勒县| 元氏县| 吉木乃县| 河间市| 汤原县| 扶余县| 枞阳县| 综艺| 吐鲁番市| 宣威市|