利用PHP實現常用的資料結構之棧(小白系列文章四)

entner發表於2019-02-16
/**
*    PHP堆疊演算法
*    Created on 2017-4-27
*    Author     entner
*    Email     1185087164@qq.com
*/

引子

    棧是計算機術語中比較重要的概念,實質上棧就是一段記憶體區域,但是棧滿足一定的特性,那就是隻有一個口,具有先入後出的特性,這種特性在計算機中有很廣泛的運用。其中幾個典型的執行如下:

  • 計算機四則運算
  • 樹的遞迴遍歷(所以樹和棧有緊密的聯絡)
  • 歷史記錄(檔案流)
  • 路徑追蹤

參看:棧的經典運用

一、默寫棧結構

默寫會讓你記憶更深刻,同時也會鍛鍊抽象的邏輯思維,一邊看不懂,就多看幾遍,
再查一查相關資料,應該問題不大,你甚至可以找張紙默寫一下。
/**
*    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]);
        }
    }
*/

二、棧結構基本實現

<?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();

三、棧的應用實現-遞迴-麵包屑導航欄

【HTML-Web佈局】

    目錄結構如下:
   
        電腦---
                |
                |
                電腦配件---
                         |
                         |
                         顯示器
                         固態硬碟
                    
                網路產品---
                         |
                         |
                         路由器
                         無線網路卡
                         
                         
                         
                         
  
<!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>

【後臺邏輯執行】


<?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`].`>`;
    }

最後

如果您覺得這篇文章對您有幫助,請您為我點個贊吧:)畢竟敲字配上感冒還是有點…

相關文章