PHP實現數據隊列

/**
 * Class Queue
 *
 * 參考地址:https://www.jianshu.com/p/ca1bb95ada76
 */
class Queue {

    /**
     * 隊列list
     *
     * @var array
     */
    protected $items = [];

    /**
     * 建立隊列元素
     *
     * @param $element
     * @param $priority
     * @return array
     */
    public function queueElement($element, $priority) {
        return [
            'element' => $element,
            'priority' => $priority
        ];
    }

    /**
     * 將數據加入隊列
     *
     * @param $element
     * @param null $priority
     * @return array
     */
    public function enqueue($element, $priority = NULL) {

        $queueElement = $this->queueElement($element, $priority);

        if ($this->isEmpty() || $priority === NULL) {
            array_push($this->items, $queueElement);
        } else {
            $add = false;
            foreach ($this->items as $key => $value) {

                if ( $priority < $value['priority'] ) {
                    array_splice($this->items, $key, 0, [$queueElement]);
                    $add = true;
                    break;
                }
            }

            if (! $add) {
                array_push($this->items, $queueElement);
            }
        }

        return $queueElement;
    }

    /**
     * 隊列消費
     *
     * @return mixed
     */
    public function dequeue() {

        return array_shift($this->items);
    }

    /**
     * 隊列的第一個元素
     *
     * @return mixed
     */
    public function front() {
        return $this->items[0];
    }

    /**
     * 隊列是否爲空
     *
     * @return bool
     */
    public function isEmpty() {
        return !!! count($this->items);
    }

    /**
     * 隊列items大小
     *
     * @return int
     */
    public function size() {
        return count($this->items);
    }
}

$queue = new Queue();

$queue->enqueue("abc", 10);
$queue->enqueue("def", 5);
$queue->enqueue("hig", 12);
$queue->enqueue("ijk", 3);

$size = $queue->size();

for ($i = 0; $i < $size; $i++) {
    $item = $queue->dequeue();
    print_r($item);
}
相關文章
相關標籤/搜索