Реализация PHP-стека

Я хочу построить стек, реализованный в PHP. Первоначально у меня есть этот код:

class Stack { protected $stack; protected $limit; public function __construct($limit = 10) { // initialize the stack $this->stack = array(); // stack can only contain this many items $this->limit = $limit; } public function push($item) { // trap for stack overflow if (count($this->stack) < $this->limit) { // prepend item to the start of the array array_unshift($this->stack, $item); } else { throw new RunTimeException('Stack is full!'); } } public function pop() { if ($this->isEmpty()) { // trap for stack underflow throw new RunTimeException('Stack is empty!'); } else { // pop item from the start of the array return array_shift($this->stack); } } public function top() { return current($this->stack); } public function isEmpty() { return empty($this->stack); } } 

И инициализируйте класс, обычно используя это:

 $stack = new Stack(); $stack->push(1); $stack->push(2); $stack->push(3); $stack->push(4); $stack->push(5); 

Это правильно и работает. Тем не менее, я хочу инициализировать мой стек с начальным значением следующим образом:

 $stack = new Stack(array(1,2,3,4,5)); 

Как я могу это реализовать?


Обратите внимание, что все другие функции (например, pop и push) являются функциональными.

    Related of "Реализация PHP-стека"

    Измените свой конструктор следующим образом:

     <?php class Stack { protected $stack; protected $limit; public function __construct($limit = 10, $initial = array()) { // initialize the stack $this->stack = $initial; // stack can only contain this many items $this->limit = $limit; } public function push($item) { // trap for stack overflow if (count($this->stack) < $this->limit) { // prepend item to the start of the array array_unshift($this->stack, $item); } else { throw new RunTimeException('Stack is full!'); } } public function pop() { if ($this->isEmpty()) { // trap for stack underflow throw new RunTimeException('Stack is empty!'); } else { // pop item from the start of the array return array_shift($this->stack); } } public function top() { return current($this->stack); } public function isEmpty() { return empty($this->stack); } } /** * This'll work as expected. */ $stack = new Stack(); $stack->push(1); $stack->push(2); $stack->push(3); $stack->push(4); $stack->push(5); /** * And this too. */ $stack = new Stack(10, array(1, 2, 3, 4, 5)); 

    Просто FYI, PHP имеет реализации array_push ( http://php.net/manual/en/function.array-push.php ) и array_pop ( http://us3.php.net/array_pop ).

    Вот реализация правильного класса стека. Чтобы правильно инициализировать массив до значения стека, вы должны изменить значения этого массива следующим образом:

     class Stack { protected $stack; protected $limit; public function __construct($values = array(),$limit = 10) { // initialize the stack $this->stack = array_reverse($values); // stack can only contain this many items $this->limit = $limit; } public function push($item) { // trap for stack overflow if (count($this->stack) < $this->limit) { // prepend item to the start of the array array_unshift($this->stack, $item); } else { throw new RunTimeException('Stack is full!'); } } public function pop() { if ($this->isEmpty()) { // trap for stack underflow throw new RunTimeException('Stack is empty!'); } else { // pop item from the start of the array return array_shift($this->stack); } } public function top() { return current($this->stack); } public function isEmpty() { return empty($this->stack); } } 

    Счастливое кодирование!

    Простой, измените свой конструктор:

     public function __construct($limit = 10, $values = array()) { // initialize the stack $this->stack = $values; // stack can only contain this many items $this->limit = $limit; } 

    Измените конструктор на это. При этом вы не можете указать значение или одно значение или несколько значений в массиве. Он выдает ошибку, если значения превышают лимит.

      public function __construct($limit = 10, $values = null) { // stack can only contain this many items $this->limit = $limit; // initialize the stack $this->stack = array(); if (is_null($values)) $values = array(); else if (!is_array($values)) $values = array($values); foreach ($values as $value) $this->push($value); } 

    Там, надеюсь, это помогает.