【问题标题】:PHP Queue class issuePHP队列类问题
【发布时间】:2013-06-11 17:31:59
【问题描述】:

我正在尝试为类Queue 编写一个方法,该方法反转整个Queue。运行程序后出现如下问题:

不能将队列类型的对象用作echo($i.". ".$this->kolejka[$i-1]."<br>");线上的数组

显然当他试图在倒置的Queue 上再次使用printOut 方法时。请帮忙!

请不要笑(笑得太厉害),因为我尝试了很多方法来完成这项工作,但我迷路了。

这是整个代码:

<?php
class Queue
{
private $Queue = array(); //Init

public function clear() //Clears the Queue
{
    $this->Queue = array();
}


public function isMember($item) //Returns True if element is in the Queue
{
    foreach($this->Queue as $x)
    {
        if($item === $x)
        {

            return true;
        }
    }
    return false;
}


public function remove() //Removes first element
{
    return array_shift($this->Queue);
}


public function add($item) //Adds element to the end
{
    $this->Queue[] = $item;
}


public function first() //Returns the first element
{
    return current($this->Queue);
}

public function printOut() //Writes down in order all the elements
{
  for($i=1;$i < count($this->Queue)+1;$i++)
  {
    echo($i.". ".$this->Queue[$i-1]."<br>");
  }

} 

    public function length() //Returnts length
{
  return count($this->Queue);
}

public function invert() //Reverts the Queue
{
   $newQueue = new Queue();
   for ($i = $this->length() - 1;$i>=0;$i--)
   {
     $newQueue->add($this->first());
     $this->remove();
   }
   $this->Queue = $newQueue;
}

}

$kolej = new Queue();
$kolej->add("Apple");
$kolej->add("Orange");
$kolej->add("Banana");
$kolej->add("Mandarin");
$kolej->add("Raspberry");
echo $kolej->first()."<br>";
$kolej->remove();
echo $kolej->first()."<br>";
echo $kolej->isMember("Apple")."<br>";
echo $kolej->isMember("Orange")."<br>";
$kolej->printOut();
echo "Currently Queue is of length ".$kolej->length()."<br>";
$kolej->invert();
$kolej->printOut();
?>

【问题讨论】:

    标签: arrays class object queue


    【解决方案1】:

    你的invert() 函数做错了。 $this-&gt;Queue 应该是一个数组:

    private $Queue = array(); //Init
    

    ,但在函数结束时,您将其设置为一个对象(名为 $newQueue):

    public function invert() //Reverts the Queue
    {
       $newQueue = new Queue();
       for ($i = $this->length() - 1;$i>=0;$i--)
       {
         $newQueue->add($this->first());
         $this->remove();
       }
       $this->Queue = $newQueue;
    }
    

    您可以通过以下两种方式之一解决此问题:

    1. $this-&gt;Queue 设置为$newQueue-&gt;Queue(您可能必须将其设为非私有变量)
    2. 了解如何invert an array in place 而不是创建临时数组

    【讨论】:

    • 非常感谢,现在我明白了。除此之外,我还看到了算法的另一个重要问题。该方法不会还原它,而是精确地复制它。现在它已经修复了。再次感谢:-)
    • 不客气!以后,如果您发现某个答案有用,您可以点击旁边的向上箭头为它投票,或者您可以点击小复选框将其标记为您问题的已接受答案。
    【解决方案2】:

    这里是倒置法的固溶体。我希望这有帮助。

    //Reverts the Queue
    public function invert() { 
        $newQueue = array();
        for ($i = 0; $i < count($this->Queue) + 1; $i++) {
            $newQueue[$i] = $this->Queue[count($this->Queue) - 1 - $i];
            echo $newQueue[$i] . '<br/>';
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 2011-04-02
      • 1970-01-01
      相关资源
      最近更新 更多