php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

php标准库中的优先队列SplPriorityQueue怎么使用?(继承)

一、总结

1、new对象,然后通过insert方法和extract方法来使用,top方法也很常用。

2、类的话首先想到继承,所以可以继承SplPriorityQueue来实现自己特定功能的优先队列。(继承思想)

二、php标准库中的优先队列SplPriorityQueue怎么使用?

而优先队列SplPriorityQueue是基于(后文介绍)实现的。

SplPriorityQueue简单使用:

 1 $pq = new SplPriorityQueue();
 2   
 3 $pq->insert('a', 10);
 4 $pq->insert('b', 1);
 5 $pq->insert('c', 8);
 6   
 7 echo $pq->count() .PHP_EOL; //3
 8 echo $pq->current() . PHP_EOL; //a
 9   
10 /**
11  * 设置元素出队模式
12  * SplPriorityQueue::EXTR_DATA 仅提取值
13  * SplPriorityQueue::EXTR_PRIORITY 仅提取优先级
14  * SplPriorityQueue::EXTR_BOTH 提取数组包含值和优先级
15  */
16 $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);
17   
18 while($pq->valid()) {
19   print_r($pq->current()); //a c b
20   $pq->next();
21 }
22  

三、php手册:SplPriorityQueue

简介 ¶

The SplPriorityQueue class provides the main functionalities of a prioritized queue, implemented using a max heap.

类摘要 ¶

SplPriorityQueue implements Iterator Countable {
/* 方法 */
public __construct ( void )
public int compare ( mixed $priority1 , mixed $priority2 )
public int count ( void )
public mixed current ( void )
public mixed extract ( void )
public int getExtractFlags ( void )
public void insert ( mixed $value , mixed $priority )
public bool isCorrupted ( void )
public bool isEmpty ( void )
public mixed key ( void )
public void next ( void )
public void recoverFromCorruption ( void )
public void rewind ( void )
public void setExtractFlags ( int $flags )
public mixed top ( void )
public bool valid ( void )
}

Table of Contents ¶

 1 quick implementation of SPL Priority Queue: 
 2 
 3 <?php 
 4 
 5 class PQtest extends SplPriorityQueue 
 6 { 
 7     public function compare($priority1, $priority2) 
 8     { 
 9         if ($priority1 === $priority2) return 0; 
10         return $priority1 < $priority2 ? -1 : 1; 
11     } 
12 } 
13 
14 $objPQ = new PQtest(); 
15 
16 $objPQ->insert('A',3); 
17 $objPQ->insert('B',6); 
18 $objPQ->insert('C',1); 
19 $objPQ->insert('D',2); 
20 
21 echo "COUNT->".$objPQ->count()."<BR>"; 
22 
23 //mode of extraction 
24 $objPQ->setExtractFlags(PQtest::EXTR_BOTH); 
25 
26 //Go to TOP 
27 $objPQ->top(); 
28 
29 while($objPQ->valid()){ 
30     print_r($objPQ->current()); 
31     echo "<BR>"; 
32     $objPQ->next(); 
33 } 
34 
35 ?> 
36 
37 output: 
38 
39 COUNT->4 
40 Array ( [data] => B [priority] => 6 ) 
41 Array ( [data] => A [priority] => 3 ) 
42 Array ( [data] => D [priority] => 2 ) 
43 Array ( [data] => C [priority] => 1 )

四、测试题-简答题

1、SplPriorityQueue的入队方法和出队方法是什么?

解答:insert和extract。top方法也很常用。

2、如何遍历一个SplPriorityQueue?

解答:valid()+current()+next()。

29 while($objPQ->valid()){ 
30     print_r($objPQ->current()); 
31     echo "<BR>"; 
32     $objPQ->next(); 
33 } 

3、SplPriorityQueue的实现原理是什么,用的那种数组结构?

解答:用的大根堆。using a max heap。

4、如何插入一个元素到SplPriorityQueue中去?

解答:$objPQ->insert('A',3);  先值后优先级,是一个map。

5、如何写符合自己功能的优先队列(通过继承)?(有类先想继承)

解答:继承SplPriorityQueue类即可,class PQtest extends SplPriorityQueue 。

6、如何设置SplPriorityQueue的提取数据方式,是值是优先级还是两者都提取?

解答:通过SPLPriorityQueue的setExtractFlags方法,$pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);

原文地址:https://www.cnblogs.com/Renyi-Fan/p/9103176.html