heap.hh

 #ifndef HEAP_HH
#define HEAP_HH #include <iostream>
#include <stdexcept>
#include <cassert> using namespace std; template <typename T, int maxsize>class heap//模板类heap,类型T,常量maxsize
{
private:
int num_values;//当前存储的元素的数量
T values[maxsize];//存储元素的数组 int parent(int index)
{
return (index - ) / ;
} int left_child(int index)
{
return * index + ;
} int right_child(int index)
{
return * index + ;
} void sift_down(int index)
{
assert(index < num_values);
int left = left_child(index);
int right = right_child(index); if(left >= num_values)
{
return;
}
if(right >= num_values)
{
if(values[left] < values[index])
{
swap_values(index, left);
}
}
else
{
T left_value = values[left];
T right_value = values[right];
int swap_child; if(left_value < values[index] || right_value < values[index])
{
if(left_value < right_value)
{
swap_child = left;
}
else
swap_child = right;
swap_values(index, swap_child);
sift_down(swap_child);
}
}
} void sift_up(int index)
{
int parent_index = parent(index);
if(index == )
{
return;
}
assert(parent_index >= );
assert(parent_index != index);
if(values[index] < values[parent_index])
{
swap_values(index, parent_index);
if(parent_index != )
{
sift_up(parent_index);
}
}
} void swap_values(int i, int j)
{
T tmp; assert(i >= && i < num_values);
assert(j >= && j < num_values);
assert(i != j); tmp = values[i];
values[i] = values[j];
values[j] = tmp;
} public:
heap<T, maxsize>():num_values(){cout<<"初始化啦"<<endl;}//初始化,在模板中的内容就无需再初始化了,只要初始化非模板内容就可以了。 T get_first_value()
{
T result;
try
{
if(num_values == )
{
throw std::underflow_error("抛出异常:堆为空");
result = values[];
--num_values;
if(num_values != )
{
values[] = values[num_values];
sift_down();
}
return result;
}
}
catch (std::underflow_error &e)
{
cout << "捕捉异常:堆为空" << endl;
}
} void add_value(T value)
{
try
{
if(num_values >= maxsize)
{
throw std::overflow_error("抛出异常:堆为满");
}
values[num_values] = value;
++num_values;
}
catch (std::overflow_error &e)
{
cout << "捕捉异常:堆为满" << endl;
} if((num_values - )> )
sift_up(num_values - );
} T get_value(int index)
{
try
{ if(index >= maxsize)
{
throw std::overflow_error("抛出异常:访问越界");
}
return values[index];
}
catch (std::overflow_error &e)
{
cout << "捕捉异常:访问越界" << endl;
}
}
}; #endif

xyz.cc

 #include <iostream>
#include <string>
#include "heap.hh"
#include <stdlib.h>
using namespace std; int main()
{
heap<int, >heapone; for(int i = ; i < ; i++)
{
heapone.add_value(i);
} // int lastval = heapone.get_first_value();
// cout<<"value0 = "<<lastval<<endl;; for(int i = ; i < ; i++)
{
cout<<"value"<<i<<" = "<<heapone.get_value(i)<<endl; // cout<<"value"<<i<<" = "<<heapone.get_first_value()<<endl; } cout<<heapone.get_first_value()<<endl;
for(int i = ; i < ; i++)
{
cout<<"value"<<i<<" = "<<heapone.get_value(i)<<endl; cout<<heapone.get_first_value()<<endl;
for(int i = ; i < ; i++)
{
cout<<"value"<<i<<" = "<<heapone.get_value(i)<<endl; // cout<<"value"<<i<<" = "<<heapone.get_first_value()<<endl; }
cout<<"value"<<i<<" = "<<heapone.get_first_value()<<endl; } }

cs11_c++_lab5待修改的更多相关文章

  1. 一步步开发自己的博客 .NET版(11、Web.config文件的读取和修改)

    Web.config的读取 对于Web.config的读取大家都很属性了.平时我们用得比较多的就是appSettings节点下配置.如: 我们对应的代码是: = ConfigurationManage ...

  2. 一次修改闭源 Entity Provider 程序集以兼容新 EntityFramework 的过程

    读完本文你会知道,如何在没有源码的情况下,直接修改一个 DLL 以去除 DLL 上的强命名限制,并在该程序集上直接添加你的“友元程序集(一种特殊的 Attribute,将它应用在程序集上,使得程序集内 ...

  3. 当忘记mysql数据库密码时如何进行修改

    因为长时间没有使用数据库了,或者把密码改完之后就忘了数据库密码,不能正常进入数据库,也无法修改密码,有一个简单的常用修改密码方式: 1.首先找到和打开mysql.exe和mysqld.exe所在的文件 ...

  4. DB1:数据库的创建和文件的修改

    在SQL Server中,使用Create Database创建数据库,使用Alter Database命令,能够修改数据库的数据文件和日志文件. 一,创建数据库 1,在创建数据库时,最佳实践是: 创 ...

  5. ExtJS 4.2 业务开发(三)数据添加和修改

    接上面的船舶管理业务,这里介绍添加和修改操作. 目录 1. 添加操作 2. 修改操作 3. 在线演示 1. 添加操作 1.1 创建AddShipWindow.js 在业务中的view目录下创建一个Ad ...

  6. 修改eclipse皮肤

    习惯了vim黑色背景的程序猿们想必用eclipse时会倍感的不适应吧,不过没关系,因为eclipse的皮肤是可以自己定制的! 下面是我电脑上的eclipse界面,看到这个是不是找回了vim的感觉呢? ...

  7. ubuntu系统下如何修改host

    Ubuntu系统的Hosts只需修改/etc/hosts文件,在目录中还有一个hosts.conf文件,刚开始还以为只需要修改这个就可以了,结果发现是需要修改hosts.修改完之后要重启网络.具体过程 ...

  8. linux centos中添加删除修改环境变量,设置java环境变量

    前言 安装完软件必要添加环境变量.指令很少,然而长时间不写就会不自信:我写的对吗?于是百度开始,于是发现又是各有千秋.好吧,好记星不如烂笔头.当然,最重要的是,百度出来的都他妈的是如何添加环境变量,只 ...

  9. 修改session垃圾回收几率

    <?php //修改session垃圾回收几率 ini_set('session.gc_probability','1'); ini_set('session.gc_divisor','2'); ...

随机推荐

  1. [llvm] Call the LLVM Jit from c program

    stackoverflow: http://stackoverflow.com/questions/1838304/call-the-llvm-jit-from-c-program Another t ...

  2. Adb工具配置和设备连接

    ADB全程Android Debug Bridge,是Android SDK里的一个工具,用这个工具可以直接操作管理Android模拟器或者真实的Android设备(如手机). 一.Adb工具使用配置 ...

  3. 让CPU的占有率曲线听我指挥

    最近我要在公司的一个study group负责AWS的AutoScaling功能的介绍.AWS可以根据instance(虚拟机)的CPU使用量进行scaling. 为了做demo,于是就有这样一个需求 ...

  4. IE弹出窗口显示URL地址栏

    工具-->Internet 选项-->安全-->自定义级别-->允许网站打开没有地址栏或状态栏的窗口-->禁止

  5. Base64编码及其作用

    Base64编码的作用:由于某些系统中只能使用ASCII字符.Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法.它使用下面表中所使用的字符与编码. 而且base64特别适合在 ...

  6. 针对web高并发量的处理

    针对web高并发量的处理 针对高并发量的处理 一个老生常谈的话题了 至于需要运维支持的那些cdn.负载均衡神马的就不赘述了 你们都懂的 虫子在此博文只讲一些从程序角度出发的一些不错的解决方案. 至于从 ...

  7. jdk环境变量配置

    新建用户变量PATH,编辑jdk路径. 仅此而已.

  8. 一起买beta版本文档报告汇总

    一起买beta版本文档报告汇总 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 一.Beta版本冲 ...

  9. 监控服务 - Nagios配置文件详解

    Nagios的配置文件: Nagios安装后有四种默认的配置文件:主配置文件.CGI配置文件.资源定义文件.对象定义文件.这些配置文件间具有一些关系,只有充分理解各配置文件,才能使得配置Nagios服 ...

  10. U3V第三方软件驱动路径

    NI驱动位置:C:\Program Files (x86)\National Instruments\NI-IMAQdx\Staging\NI USB3 VisionA&B驱动位置:D:\Pr ...