利用PHP實現經常使用的數據結構之棧(小白系列文章四)

/**
*    PHP堆棧算法
*    Created on 2017-4-27
*    Author     entner
*    Email     1185087164@qq.com
*/

引子

    棧是計算機術語中比較重要的概念,實質上棧就是一段內存區域,可是棧知足必定的特性,那就是隻有一個口,具備先入後出的特性,這種特性在計算機中有很普遍的運用。其中幾個典型的運行以下:php

  • 計算機四則運算
  • 樹的遞歸遍歷(因此樹和棧有緊密的聯繫)
  • 歷史記錄(文件流)
  • 路徑追蹤

參看:棧的經典運用css

1、默寫棧結構

默寫會讓你記憶更深入,同時也會鍛鍊抽象的邏輯思惟,一邊看不懂,就多看幾遍,
再查一查相關資料,應該問題不大,你甚至能夠找張紙默寫一下。
/**
*    InitStack    初始化棧(單棧)
*    聲明一個類,構造空數組、數組長度、棧頂指針3個屬性
    typedef int SElememtType    //構造一個棧結構數據類型實際可認爲爲整形
    typedef Struct{
        SElememtType data[MaxSize] //聲明棧空間
        int top                 //聲明棧頂指針
    }Stack;
*/

/**
*    Push    入棧(單棧)
*    實例化棧,並注入S,判斷,前後移棧頂指針,再新增棧頂元素
    
    Status Push(Stack *S, int e){
        //    判斷是否爲滿棧    
        if(S->top == n-1){
            return error;    //滿棧
        }
        S->top =  S->top+1; //棧頂元素日後移動一位
        S->data[S->top] = e;//賦值給棧頂元素
        return ok;
    }
*/

/**
*    Pop    岀棧(單棧)
*    實例化棧,並注入S,判斷,先移除棧頂元素,再前移棧頂指針
    
    Status Pop(Stack *S, int e){
        if(S->top == -1){
            return error;    //空棧
        }
        e = S->data[S->top];
        unset(e)            //將棧頂元素移出(銷燬)
        S->top = S->top -1; //棧頂元素向前移動一位
    }
*/

/**
*    ClearStack    清空棧(單棧)
*    當棧存在且非空,遍歷棧頂元素並銷燬
    
    Status ClearStack(){
        if(S->top == -1){
            return error;    //空棧
        }
        for(S->top;S->top>1;S->top--){
            unset(S->data[S->top]);
        }
    }
*/

2、棧結構基本實現

<?php
/**
*TODO:棧元素輸入輸出
*    建立類,構造數組、數組長度、棧頂指針、岀棧標識4個屬性
*/    
Class Stack{
    protected $MaxSize = 10;
    protected $arr = [];
    protected $top = -1;
    protected $out;    //岀棧標識

/**
*TODO:入棧操做
*@pagram int $e 入棧元素
*/
    public function Push($e){
        /*    判斷:滿棧則返回錯誤    */
        if($this->top == $this->MaxSize){
            return error;
        }
        /*    前後移棧頂指針後賦值    */
        $this->top = ++$this->top;
        $this->arr[$this->top] = $e;
        /*    輸出    */
        echo "棧頂指針如今所屬位置".$this->top."--";
        echo "$e 入棧成功"."<br/>";
    }

/**
*TODO:岀棧操做
*/
    public function Pop(){
        /*    判斷:空棧則返回錯誤    */
        if($this->top == -1){
            return error;
        }
        /*    先移除棧元素針後前移棧頂指針    */
        $this->out = $this->arr[$this->top];
        $this->top = --$this->top;
        /*    輸出    */
        
        echo "棧頂指針如今所屬位置".$this->top."--";
        echo "$this->out  岀棧成功"."<br/>";
        /*    銷燬移除元素    */
        unset($this->out);    
    }

/**
*TODO:程序結束時執行
*/
    public function __destruct(){
        echo "over";
    }
}

    $stack = new Stack();
    $stack->Push("entner");//Push沒有加循環,可參看系列文章三-隊列
    $stack->Push("susan");
    $stack->Push("george");
    $stack->Pop();    //這裏一樣可使用循環操做
    $stack->Pop();
    $stack->Pop();

3、棧的應用實現-遞歸-麪包屑導航欄

【HTML-Web佈局】html

目錄結構以下:
   
        電腦---
                |
                |
                電腦配件---
                         |
                         |
                         顯示器
                         固態硬盤
                    
                網絡產品---
                         |
                         |
                         路由器
                         無線網卡
                         
                         
                         
                         
  
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        oi{
            text-indent: 2px;
        }
    </style>
</head>
<body>

<?php
        

    
    echo "<ul>";        
    echo "<li>".'<a href="stack_mbx.php?cat_id=1 ">'.'電腦配件'.'</a>'."</li>";
    echo         "<oi>".'<a href="stack_mbx.php?cat_id=3 ">'.'顯示器'.'</a>'."</oi>"."<br/>";            
    echo         "<oi>".'<a href="stack_mbx.php?cat_id=4 ">'.'固態硬盤'.'</a>'."</oi>"."<br/>";    
    echo "<li>".'<a href="stack_mbx.php?cat_id=2 ">'.'網絡產品'.'</a>'."</li>";
    echo        "<oi>".'<a href="stack_mbx.php?cat_id=5 ">'.'路由器'.'</a>'."</oi>"."<br/>";
    echo        "<oi>".'<a href="stack_mbx.php?cat_id=6 ">'.'交換機'.'</a>'."</oi>"."<br/>";        
    echo "</ul>";
?>    
</body>
</html>

【後臺邏輯執行】mysql

<?php

    //引入數據模型類
    require_once("./DB.class.php");

    /*    獲取連接參數    */
    $cat_id = $_GET['cat_id'];

    /*
    *TODO:    麪包屑導航(遞歸思想)
    *@pagram int $cat_id 目錄ID
    */    
    

    function mbx($cat_id){
        $list = array();
        $db = new DB("goods");    //這裏必定要帶上數據庫名稱,由於默認數據庫是‘mail’
        $conn = $db->link();
        $res  = mysqli_query($conn,"select * from cat");

        $arr = array();//【注:這個$arr放在函數外面不能夠,應該是函數做用域限制】
        while($row = mysqli_fetch_array($res,MYSQLI_ASSOC)){
            /*    遍歷結果集放入數組        */
            $arr[] = $row;
        }
        while($cat_id>0){
            foreach($arr as $k=>$v){
                if($cat_id == $v['cat_id']){
                $list[] = $v;
                $cat_id = $v['pid'];
                
                }
            }
            
        }
        return $list;
    }

    echo "<pre>";

    $list = array_reverse(mbx($cat_id));
    print_r($list);
    foreach($list as $k => $v){
        echo $v['Catname'].'>';
    }

最後

若是您以爲這篇文章對您有幫助,請您爲我點個贊吧:)畢竟敲字配上感冒仍是有點...算法

相關文章
相關標籤/搜索