/**
* 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`].`>`;
}
最後
如果您覺得這篇文章對您有幫助,請您為我點個贊吧:)畢竟敲字配上感冒還是有點…