NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
# SplMaxHeap(最大堆) > 注意,因为是`堆`实现,所以`rewind`方法是一个`no-op`没有什作用的操作,因为`头指针`始终指向`堆顶`,即`current`始终等于`top`,不像`List`只是游走指针,出队是会删除堆元素的,`extract`=`current + next`(current出队,从堆中删除) ## **方法:** ``` <pre class="calibre10">``` abstract SplHeap implements <span class="token4">Iterator</span> <span class="token3">,</span> Countable <span class="token3">{</span> <span class="token">/* 方法 */</span> public __construct <span class="token3">(</span> void <span class="token3">)</span> abstract protected compare <span class="token3">(</span> mixed $value1 <span class="token3">,</span> mixed $value2 <span class="token3">)</span> <span class="token3">:</span> int <span class="token">//比较元素,以便在筛选时将它们正确地放在堆中,如果value1大于value2则为正整数,如果相等则为0,否则为负整数</span> public count <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> int <span class="token">//返回元素的个数 Countable </span> public current <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> mixed <span class="token">//返回当前记录节点索引的值 超出范围返回空 Iterator</span> public extract <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> mixed <span class="token">//从堆顶部提取节点并进行筛选</span> public insert <span class="token3">(</span> mixed $value <span class="token3">)</span> <span class="token3">:</span> void <span class="token">//通过筛选将一个元素插入堆中</span> public isCorrupted <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> bool <span class="token">//判断堆是否处于损坏状态</span> public isEmpty <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> bool <span class="token">//检查堆是否为空</span> public key <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> mixed <span class="token">//返回当前节点索引 Iterator</span> public next <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> void <span class="token">//移动到下一个节点 Iterator</span> public recoverFromCorruption <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> void <span class="token">//从损坏的状态恢复并允许堆上的进一步操作</span> public rewind <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> void <span class="token">//将指针指向迭代开始处 Iterator</span> public top <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> mixed <span class="token">//返回堆顶部的节点</span> public valid <span class="token3">(</span> void <span class="token3">)</span> <span class="token3">:</span> bool <span class="token">//检查堆是否还有节点 Iterator</span> <span class="token3">}</span> ``` ``` ## **例子:** ``` <pre class="calibre10">``` $obj<span class="token1">=</span><span class="token5">new</span> <span class="token4">SplMaxHeap</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">4</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">8</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">1</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">0</span> <span class="token3">)</span><span class="token3">;</span> <span class="token4">foreach</span><span class="token3">(</span> $obj as $number <span class="token3">)</span> <span class="token3">{</span> echo $number<span class="token3">.</span><span class="token2">"\n"</span><span class="token3">;</span> <span class="token3">}</span> 结果:<span class="token6">8</span> <span class="token6">4</span> <span class="token6">1</span> <span class="token6">0</span> ``` ``` 等同于: ``` <pre class="calibre17">``` <span class="token1"><</span><span class="token1">?</span>php class <span class="token4">MySimpleHeap</span> extends <span class="token4">SplHeap</span> <span class="token3">{</span> public <span class="token5">function</span> <span class="token4">compare</span><span class="token3">(</span> $value1<span class="token3">,</span> $value2 <span class="token3">)</span> <span class="token3">{</span> <span class="token5">return</span> <span class="token3">(</span> $value1 <span class="token1">-</span> $value2 <span class="token3">)</span><span class="token3">;</span> <span class="token3">}</span> <span class="token3">}</span> $obj <span class="token1">=</span> <span class="token5">new</span> <span class="token4">MySimpleHeap</span><span class="token3">(</span><span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">4</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">8</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">1</span> <span class="token3">)</span><span class="token3">;</span> $obj<span class="token1">-</span><span class="token1">></span><span class="token4">insert</span><span class="token3">(</span> <span class="token6">0</span> <span class="token3">)</span><span class="token3">;</span> <span class="token4">foreach</span><span class="token3">(</span> $obj as $number <span class="token3">)</span> <span class="token3">{</span> echo $number<span class="token3">.</span><span class="token2">"\n"</span><span class="token3">;</span> <span class="token3">}</span> 结果:<span class="token6">8</span> <span class="token6">4</span> <span class="token6">1</span> <span class="token6">0</span> ``` ```