Я хочу построить стек, реализованный в 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) являются функциональными.
Измените свой конструктор следующим образом:
<?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); }
Там, надеюсь, это помогает.