请用C语言代码编写程序试用已知的 nn 个整数先建立一个小顶堆。 共有 mm 次操作,每次 push 操作需要向堆内插入一个新整数,每次 pop 操作则需要将堆顶元素弹出堆,并输出这个元素的值。
时间: 2024-02-22 15:59:23 浏览: 90
以下是用C语言实现的小顶堆程序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1000
int heap[MAX_N]; // 堆
int heap_size = 0; // 堆的大小
// 获取父节点下标
int parent(int i) {
return (i - 1) / 2;
}
// 获取左子节点下标
int left_child(int i) {
return i * 2 + 1;
}
// 获取右子节点下标
int right_child(int i) {
return i * 2 + 2;
}
// 上浮操作
void shift_up(int i) {
while (i > 0 && heap[i] < heap[parent(i)]) {
// 父节点和当前节点交换
int tmp = heap[i];
heap[i] = heap[parent(i)];
heap[parent(i)] = tmp;
i = parent(i);
}
}
// 下沉操作
void shift_down(int i) {
int min_index = i;
// 与左子节点比较
int l = left_child(i);
if (l < heap_size && heap[l] < heap[min_index]) {
min_index = l;
}
// 与右子节点比较
int r = right_child(i);
if (r < heap_size && heap[r] < heap[min_index]) {
min_index = r;
}
if (i != min_index) {
// 当前节点和最小子节点交换
int tmp = heap[i];
heap[i] = heap[min_index];
heap[min_index] = tmp;
shift_down(min_index);
}
}
// 插入操作
void push(int x) {
heap[heap_size++] = x;
shift_up(heap_size - 1);
}
// 弹出堆顶元素
int pop() {
int result = heap[0];
heap[0] = heap[--heap_size];
shift_down(0);
return result;
}
int main() {
int n; // 整数个数
scanf("%d", &n);
for (int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
push(x);
}
int m; // 操作次数
scanf("%d", &m);
for (int i = 0; i < m; i++) {
char op[5];
scanf("%s", op);
if (op[0] == 'p') {
int x;
scanf("%d", &x);
push(x);
} else {
printf("%d\n", pop());
}
}
return 0;
}
```
这个程序先读入 nn 个整数,然后插入到堆中,接着进行 mm 次操作,每次操作要么插入一个新整数,要么弹出堆顶元素。在插入操作时,调用 push 函数将新整数插入堆中;在弹出操作时,调用 pop 函数将堆顶元素弹出,并输出其值。
阅读全文