您好,登錄后才能下訂單哦!
<?php /** 1. DestroyStack(): 棧的銷毀 2. ClearStack(): 將棧置為空棧 3. StackEmpty(): 判斷棧是否為空 4. StackLength(): 返回棧的長度 5. GetTop(): 取得棧頂的元素 6. Push(): 插入新的棧頂元素 7. Pop(): 刪除棧頂元素 8. StackTraverse(): 遍歷棧元素 */ class LNode{ public $data; public $next; public function __construct($data=null){ $this->data=$data; $this->next=null; } } class LinkStack{ private $top; //用于指向棧頂結點,也就是第一個結點。相對于頭指針.此時或許有人有疑問了,你之前不是說this代表頭指針嗎?為什么現在有變成top為頭指針了呢? // 答: // 之所以之前this代表頭指針,是因為它指向了一個和其它結點一樣的結點——頭結點(實例化后的對象即為頭結點,因為其初始化的數據域自始至終都為null)。而此處的this并沒有指向和其它結點一樣的結點(即頭結點),也不指向第一個結點,另外,因為對沒有頭結點的鏈表的操作(比如清空鏈表),需要判斷當前的指針是否為空,而此時若是this指向第一個結點,那么這個鏈表將永遠不會為空(因為this代表兩個一個實例化的對象,始終是一個內存地址)。所以此處的this不是且不能是頭指針。因而需要單獨指定一個成員屬性top,用于指向第一個結點,因為其可以為null,所以top就是我們定義的頭指針。此處的關鍵點在于,是否在類中要聲明和結點類(即LNode)一樣的成員屬性,若一樣則就是包含頭結點的鏈式結構,若是僅包含一個指針域的屬性則就是不包含頭結點的鏈式結構。由此,我們可以知道,關于一些邊界判斷的條件,是由我們編程者自己來決定的,不需要拘泥于形式,只要滿足操作要求即可。 private $length;//用于指定鏈棧的長度 public function __construct(){ $this->top=null; $this->length=0; } //銷毀鏈棧 public function DestroyStack(){ while($this->top){ $p=$this->top->next; unset($this->top); $this->top=$p; } $this->length=0; } //清空鏈棧 public function ClearStack(){ $p=$this->top; while($p){ $q=$p->next; unset($p); $p=$q; } $this->top=null; $this->length=0; } //鏈棧是否為空 public function StackEmpty(){ if($this->top==null){ return 'Null'; }else{ return 'NO Null'; } } //鏈棧的長度 public function StackLength(){ return $this->length; } //取得棧頂的元素 public function GetTop(){ if($this->top!=null){ return $this->top->data; } } //插入新的棧頂結點 public function Push(){ $node=new LNode(mt_rand(10,20)); $node->next=$this->top; $this->top=$node; $this->length++; } //刪除棧頂元素 public function Pop(){ if($this->top!=null){ $p=$this->top->next; unset($this->top); $this->top=$p; $this->length--; } } //遍歷棧元素 public function StackTraverse(){ $arr=array(); if($this->top !=null){ $p=$this->top; while($p){ $arr[]=$p->data; $p=$p->next; } } return $arr; } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。