PTA 最小堆插入元素和删除堆顶(无哨兵元素) (20分)

对于给定的最小堆(优先队列),分别实现插入元素和删除堆顶的函数。

函数接口定义:

int insertIntoHeap(struct Heap* h, int x);  // 向堆中插入元素x
int deleteMin(struct Heap* h, int* pElement); //将堆顶元素拷贝到pElement所指变量并删除堆顶元素

其中,h、x和pElement为参数,h是堆结构体指针,x是待插入元素的值,pElement指向的变量用于存放删除的堆顶元素。

堆结构体定义如下:

struct Heap{
int *data; // 堆元素存储空间指针,堆元素从data[1]开始存放,data[0]不使用,无哨兵元素
int capacity; // 堆容量
int size; // 堆元素数量
};

裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
struct Heap{
int *data;
int capacity;
int size;
};
struct Heap* initHeap(int capacity){ // 初始化堆
struct Heap* h;
h = (struct Heap*)malloc(sizeof(struct Heap));
if(!h) return NULL;
h->data = (int*)malloc(sizeof(int)*capacity+1);
if(h->data == NULL){
free(h);
return NULL;
}
h->capacity = capacity;
h->size = 0;
return h;
};
void printHeap(struct Heap* h){ // 打印堆元素
/* 细节省略 */
}
int insertIntoHeap(struct Heap* h, int x);
int deleteMin(struct Heap* h, int* pElement);
int main(){
struct Heap *h;
int n;
scanf("%d", &n); // 输入堆容量
h = initHeap(n);
int op, x;
scanf("%d", &op);
while(op){ // 输入操作: -1表示删除 1表示插入 0表示结束
if(op == 1){
scanf("%d", &x);
printf("Insertion %s. ", insertIntoHeap(h, x) ? "succeeded" : "failed" );
printHeap(h);
}
else{
if (deleteMin(h, &x) ) printf("%d deleted. ", x);
else printf("Deletion failed. ");
printHeap(h);
}
scanf("%d", &op);
}
return 0;
} /*你提交的代码将被嵌在这里 */

输入样例:

对于样例测试程序规定的输入格式:

3
1 10
1 20
1 5
1 40
-1
-1
-1
-1
0

输出样例:

样例测试程序的输出:

Insertion succeeded. 10,
Insertion succeeded. 10, 20,
Insertion succeeded. 5, 20, 10,
Insertion failed. 5, 20, 10,
5 deleted. 10, 20,
10 deleted. 20,
20 deleted.
Deletion failed.

【程序实现】

int insertIntoHeap(struct Heap* h, int x) {
if (h->capacity == h->size) return 0;
int i = ++h->size;
for(; h->data[i/2] > x && i > 1; i /= 2)
h->data[i] = h->data[i/2];
h->data[i] = x;
return 1;
}
int deleteMin(struct Heap* h, int* pElement) {
if(!h->size) return 0;
*pElement = h->data[1];
int t = h->data[h->size--];
int parent, child;
for(parent = 1; parent*2 <= h->size; parent = child) {
child = parent*2;
if(child != h->size && h->data[child] > h->data[child+1])
child++;
if(h->data[child] > t) break;
else h->data[parent] = h->data[child];
}
h->data[parent] = t;
return 1;
}

PTA 最小堆插入元素和删除堆顶(无哨兵元素) (20分)的更多相关文章

  1. 删除vector中的偶数元素,删除list中的奇数元素

    #include<vector> #include<list> #include<iostream> using namespace std; int main() ...

  2. 去除List<Object>集合中重复的元素(利用HashSet的特性---无重复元素)

    import java.util.ArrayList;import java.util.HashSet;import java.util.Iterator; public class Hashset ...

  3. 删除STL容器中的元素

    有关stl容器删除元素的问题,错误的代码如下: std::vector<struct> mFriendList; ... std::vector<struct>::iterat ...

  4. PIE SDK元素的删除

    1功能简介 元素删除是将根据需求将不符合的元素进行删除,PIE SDK支持元素的删除操作,下面对元素的删除功能进行介绍. 2功能实现说明 2.1.1 实现思路及原理说明 第一步 获取已经选择的元素 第 ...

  5. 《github一天,一个算术题》:堆算法接口(堆排序、堆插入和堆垛机最大的价值,并删除)

    阅览.认为.编写代码! /********************************************* * copyright@hustyangju * blog: http://blo ...

  6. Java实现堆的封装,进行插入,调整,删除堆顶以完成堆排序实例

    简介 堆对于排序算法是一个比较常用的数据结构,下面我就使用Java语言来实现这一算法 首先,我们需要知道堆的数据结构的形式,其实就是一个特殊的二叉树.但是这个二叉树有一定的特点,除了是完全二叉树以外, ...

  7. 【bzoj5210】最大连通子块和 树链剖分+线段树+可删除堆维护树形动态dp

    题目描述 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块和. 其中,一棵子树的最大连通子块和指的是:该子树 ...

  8. php面试题7(1、unset变量是删除栈变量,并不删除堆变量)(2、php爬虫特别简单: 可以file_get_contents和直接fopen)

    php面试题7(1.unset变量是删除栈变量,并不删除堆变量)(2.php爬虫特别简单: 可以file_get_contents和直接fopen) 一.总结 1.unset变量是删除栈变量,并不删除 ...

  9. javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

    主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除 ...

随机推荐

  1. 一文让你快速入门pytest框架

    pytest是什么 官方文档描述: pytest is a framework that makes building simple and scalable tests easy. Tests ar ...

  2. 真机连接电脑后,adb devices显示为空-解决方案

    真机:小米6x,adb版本 真机连接电脑后,在cmd中输入adb devices,显示为空. 原因是真机没开启开发者选项和USB调试. 解决方案: 手机的[设置]-[我的设备]-[全部参数],多次点击 ...

  3. aizhan查询旁IP网站脚本

    <?php print_r("-------------------------\r\n"); print_r("-------爱站旁站查询------\r\n&q ...

  4. C++核心编程 2 引用

    引用的基本使用 作用:给变量起别名 ,语法:数据类型 & 别名 = 原名 注意:引用必须初始化,且初始化之后,就不可更改. 引用做函数参数 作用:函数传参时,可以利用引用的技术让形参修饰实参 ...

  5. Java到底怎么学?

    你现在是不是想学Java,但很迷茫不知该从何下手,那么请认真看完这篇文章,希望对你有所帮助! 作为零基础刚刚接触Java的朋友们来说,我的建议还是先看视频,虽然有很多人说看视频学习慢,建议直接买优秀的 ...

  6. HDC 2021 | HMS Core 6.0:连接与通信论坛,为App打造全场景连接体验

    如何在弱网环境下让用户享受无中断沉浸体验? 如何在全场景互联中让多设备交互如丝般顺滑? 如何在无网区域让移动终端发出紧急求助信息? 连接无处不在,连接与体验息息相关!流畅的网络体验已成为应用开发的关键 ...

  7. linux启动redis命令

    首先进入到/usr/local/bin目录下(因为你redis安装的目录绝大多数都在这里) root@xxxx:/usr/local/bin#:redis-server wangconfig/redi ...

  8. 题解 「JOISC 2016 Day 3」电报

    题目传送门 题目大意 给出一个\(n\)个点\(n\)条边的图,每个点有且仅有一个出边,改变每条边都会有对应的花费.求最小的花费使得整个图强连通. 思路 很显然,最后的图就是一个环.那我们要求的答案实 ...

  9. Miller-Rabin学习笔记

    首先给出两个定理: 1.费马小定理 设p是一个素数,a是一个整数,且不是p的倍数,那么 \(a^{p−1} \equiv\ 1 \pmod p\) 2.二次探测定理 若\(p\)是素数,\(x\)是一 ...

  10. flask 之上传本地图片

    项目配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 import os class Config(object): DEBUG = True SQLALCHEMY_DATABA ...