畫江湖之資料結構 [第二話:佇列和棧] 棧

Krisji發表於2019-03-19

1 棧簡介

概括:

  • 棧(stack),它是一種運算受限的線性表。其限制是僅允許在表的一端進行插入和刪除運算。允許操作的一端被稱為棧頂,相對地,把另一端稱為棧底。向一個棧插入新元素又稱為壓棧,它是把新元素放到棧頂元素的上面,使之成為新的棧頂元素;從一個棧刪除元素被稱作出棧或退棧,就是把棧頂元素刪除掉,使其相鄰的下個元素成為新的棧頂元素。
    file

完整程式碼塊

<?php

class Node{
    public $data = null;
    public $prev = null;

    public function __construct($data){
        $this->data = $data;
    }
}

class stack{
    private $top = null;
    public $size = 0;

    public function push($data)
    {
        if($this->top == null){
            $this->top = new Node($data);
        }else{
            $n = new Node($data);
            $n->prev = $this->top;
            $this->top = $n;
        }
        $this->size++;
    }

    public function pop()
    {
        $data = $this->top->data;
        $this->top = $this->top->prev;
        $this->size--;
        return $data;
    }

    public function getAll(){
        $result = [];
        while($this->top){
            $result[]=$this->top->data;
            $this->top = $this->top->prev;
        }
        return $result;
    }

}

// $s = new stack();
// $s->push("aaaa");
// $s->push("bbb");
// $s->push("dddddd");
// $s->push("cc");
// $s->push("eeee");
// echo '<pre>';
// echo $s->pop();

// var_dump($s->getAll());

//陣列模擬棧

// $stack = [];
// array_push($stack,"aaa");
// array_push($stack,"bbb");
// array_push($stack,"ccc");
// array_push($stack,"ddd");
// array_push($stack,"eee");
// echo array_pop($stack);
// echo array_pop($stack);

2 分析程式碼塊 具體分析到程式碼註釋哦 ~ 棧是先進後出的結構哦

先定義一個節點物件

class Node{
    public $data = null;
    public $prev = null;

    public function __construct($data){
        $this->data = $data;
    }
}

壓入棧

private $top = null;//尾部
    public $size = 0;//棧的大小

    public function push($data)
    {
        if($this->top == null){//如果還沒有棧進去
            $this->top = new Node($data);//就把壓入生成的棧給到尾部
        }
        //如果已經存在棧的話
        else{
            $n = new Node($data);//先定義一個節點物件
            $n->prev = $this->top;//把尾部的棧變成當前插入的棧的上一個
            $this->top = $n;//把尾部棧為當前棧
        }
        $this->size++;//棧的大小+++
    }
     $s = new stack();
     $s->push("aaaa");
     $s->push("bbb");
     $s->push("dddddd");
     $s->push("cc");
     $s->push("eeee");

出棧

public function pop()
    {
        $data = $this->top->data;//直接輸出尾部的棧
        $this->top = $this->top->prev;//把尾部的棧的拉到上一個節點
        $this->size--;//棧的大小--
        return $data;//返回棧的數值
    }
    // echo $s->pop();

3 利用php的自帶的陣列實現棧

程式碼段 和分析程式碼~

//陣列模擬棧
 $stack = [];
 array_push($stack,"aaa");//插入到棧
 array_push($stack,"bbb");
 array_push($stack,"ccc");
 array_push($stack,"ddd");
 array_push($stack,"eee");
 echo array_pop($stack);//從陣列尾部出來一個棧
 echo array_pop($stack);
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章