4
/**
*    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'].'>';
    }

最后

如果您觉得这篇文章对您有帮助,请您为我点个赞吧:)毕竟敲字配上感冒还是有点...


entner
751 声望187 粉丝

青年 ---------------