1 top = 0;18 foreach($a as $val) {19 $this->push($val);20 }21 }22 23 public function push($i) {24 $node = new Node();25 $node->data = $i;26 27 #此处设置每个节点的min值,设置方法为若栈为空,当前元素data则为当前节点的min28 #若栈非空,则当前元素data与前一个节点的min值比较,取其小者作为当前节点的min29 if ($this->top == 0) {30 $min = $node->data;31 } else {32 $min = $this->data[$this->top - 1]->min < $node->data ? $this->data[$this->top - 1]->min : $node->data;33 }34 35 $node->min = $min;36 $this->data[] = $node;37 $this->top++;38 return $node;39 }40 41 public function pop() {42 $r = $this->data[--$this->top];43 unset($this->data[$this->top]);44 return $r;45 }46 47 public function get_min() {48 return $this->data[$this->top - 1]->min;49 }50 }51 52 $a = array(5, 7, 3, 8, 9, 1, 2);53 $min_stack = new Min_Stack($a);54 echo "Min : { $min_stack->get_min()} ";55 print_r($min_stack);56 echo " Pop : { $min_stack->pop()->data}";57 print_r($min_stack); 58 ?>
Min : 1
Min_Stack Object ( [data:Min_Stack:private] => Array ( [0] => Node Object ( [data] => 5 [min] => 5 ) [1] => Node Object ( [data] => 7 [min] => 5 ) [2] => Node Object ( [data] => 3 [min] => 3 ) [3] => Node Object ( [data] => 8 [min] => 3 ) [4] => Node Object ( [data] => 9 [min] => 3 ) [5] => Node Object ( [data] => 1 [min] => 1 ) [6] => Node Object ( [data] => 2 [min] => 1 ) ) [top:Min_Stack:private] => 7 ) Pop : 2Pop : 1Min : 3 Min_Stack Object ( [data:Min_Stack:private] => Array ( [0] => Node Object ( [data] => 5 [min] => 5 ) [1] => Node Object ( [data] => 7 [min] => 5 ) [2] => Node Object ( [data] => 3 [min] => 3 ) [3] => Node Object ( [data] => 8 [min] => 3 ) [4] => Node Object ( [data] => 9 [min] => 3 ) ) [top:Min_Stack:private] => 5 )