PHP 程序员学数据结构与算法之《栈》

介绍
 
  “要成高手,必练此功”。
 
  要成为优秀的程序员,数据结构和算法是必修的内容。而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈操作array_pop,进栈操作array_push,都有指定的库函数,导致我们对基础算法的研究越来越少,最后成为一个工具的傀儡而已。
 
  所以我还是建议更多的coder从基础开始学习。这篇就先讲我们最熟悉的栈操作开始入手,让我们熟悉栈。
   

  

 
栈为何物?
 
  口诀“进先出”,这是我印象最深的一句话,也是老师一坨讲解中,印象最深刻的。
  
  定义:栈是限制插入和删除都只能发生在一个位置上进行的线性表,该位置是线性表的末端,叫做栈的顶。
  过程:先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。
 

            

 

 

分析
 
  通过定义和过程,我们分析出数据结构(红色标识),动作部分(蓝色标识),以及动作的规则(黄色标识)。
 
                                请看

                               组成成分 
  数据:线性表(用array结构保存命名为data),末端索引(用int结构保存命名为end,初始值为null——因为开始线性表是没有元素的,所以就没有末端索引这么一说,而且由于不断取数据,添加数据,这个末端是变化的元素。)。
  动作(方法):压入(push:规则,放在线性表最后面),弹出(pop:规则,从最后取出,并且末端位置向前移动)。
 
 
编码
 
 1 <?php
 2 class Stack
 3 {
 4     private $_data = [];
 5     private $_end = null;
 6 
 7     public function push($data)
 8     {
 9         if($this->_end === null)
10             $this->_end = 0;
11         else
12             $this->_end++;
13         $this->_data[$this->_end] = $data;
14     }
15 
16     public function pop()
17     {
18         if(empty($this->_data)) return false;
19         $ret = $this->_data[$this->_end];
20         //末端数据已经取走 所以删除末端数据
21         //而且末端位置也应该向前移动一个位置
22         array_splice($this->_data, $this->_end);
23         $this->_end--;
24         return $ret;
25     }
26 
27     public function getData()
28     {
29         return $this->_data;
30     }
31 }
32 
33 $stack = new Stack();
34 $stack->push('chuan');
35 $stack->push('shan');
36 $stack->push('jia');
37 $pop_data = $stack->pop();
38 var_dump($pop_data, $stack->getData());

 

                               运行结果

  

  

总结
  
 以上是本人对栈的分析理解过程,由于我是一名php coder,所以我用php的角度去分析和编码。
 
如果是C语言去编码,数组应该指定最大宽度,因为C语言数组不像php数组能自行增长,必须要有一个初始宽度。
 
推荐
 
posted @ 2017-03-24 13:47  ー個亽の江湖  阅读(140)  评论(0编辑  收藏  举报