/**
* 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'].'>';
}
最后
如果您觉得这篇文章对您有帮助,请您为我点个赞吧:)毕竟敲字配上感冒还是有点...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。