PHP数据结构之五:栈的PHP的实现和栈的基本操作

from:http://www.phpboy.net/web/php/57.html



栈和队列是两种应用非常广泛的数据结构,它们都来自线性表数据结构,都是“操作受限”的线性表。

栈在计算机的实现有多种方式:

硬堆栈:利用CPU中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现。这类堆栈容量有限,但速度很快;

软堆栈:这类堆栈主要在内存中实现。堆栈容量可以达到很大。在实现方式上,又有动态方式和静态方式两种

1.定义:
栈(Stack):是限制在表的一端进行插入和删除操作的线性表。又称为后进先出LIFO (Last In First Out)或先进后出FILO (First In Last Out)线性表。

栈顶(Top):允许进行插入、删除操作的一端,又称为表尾。用栈顶指针(top)来指示栈顶元素。

栈底(Bottom):是固定端,又称为表头。

空栈:当表中没有元素时称为空栈。

2.栈的顺序存储表示

3.栈的链式存储表示
栈的链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。下面是PHP实现的栈的基本操作,仅为本人个人创作,仅供参考!


<?php
/**
 *栈的链式储存表示和栈的基本操作
 *
 *1.初始化栈 __construct()
 *2.判断栈是否空栈 getIsEmpty()
 *3.将所有元素出栈 getAllPopStack()
 *4.返回栈内元素个数 getLength()
 *5.元素进栈 getPushStack()
 *6.元素出栈 getPopStack()
 *7.仅返回栈内所有元素 getAllElem()*8.返回栈内某个元素的个数 getCountForElem()
 */
header("content-type:text/html;charset=UTF-8");
class LNode{
	public $mElem;
	public $mNext;
	public function __construct(){
		$this->mElem=null;
		$this->mNext=null;
	}
}
class StackLinked{

	//头“指针”,指向栈顶元素
	public $mNext;
	public static $mLength;

	/**
 	*初始化栈
 	*
 	*@return void
 	*/
	public function __construct(){
		$this->mNext=null;
		self::$mLength=0;
	}

	/**
	 *判断栈是否空栈
	 *
	 *@return boolean  如果为空栈返回true,否则返回false
	 */
	public function getIsEmpty(){
		if($this->mNext==null){
			return true;
		}else{
			return false;
		}
	}

	/**
	 *将所有元素出栈
	 *
	 *@return array 返回所有栈内元素
	 */
	public function getAllPopStack(){
		$e=array();
		if($this->getIsEmpty()){
		}else{
			while($this->mNext!=null){
				$e[]=$this->mNext->mElem;
				$this->mNext=$this->mNext->mNext;
			}
		}
		self::$mLength=0;
		return $e;
	}

	/**
	 *返回栈内元素个数
	 *
	 *@return int
	 */
	public static function getLength(){
		return self::$mLength;
	}

	/**
	 *元素进栈
	 *
	 *@param mixed $e 进栈元素值
	 *@return void
	 **/
	public function getPushStack($e){
		$newLn=new LNode();
		$newLn->mElem=$e;
		$newLn->mNext=$this->mNext;
		$this->mNext=&$newLn;
		self::$mLength++;
	}

	/**
	 *元素出栈
	 *
	 *@param LNode $e 保存出栈的元素的变量
	 *@return boolean 出栈成功返回true,否则返回false
	 **/
	public function getPopStack(&$e){
		if($this->getIsEmpty()){
			return false;
		}
		$p=$this->mNext;
		$e=$p->mElem;
		$this->mNext=$p->mNext;
  		self::$mLength--;
 	}

	/**
	 *仅返回栈内所有元素
	 *
	 *@return array 栈内所有元素组成的一个数组
	 */
	public function getAllElem(){
		$sldata=array();
		if($this->getIsEmpty()){
		}else{
			$p=$this->mNext;
			while($p!=null){
				$sldata[]=$p->mElem;
				$p=$p->mNext;
			}
			return $sldata;
		}

	}
	/**
	 * 返回栈内某个元素的个数
	 *
	 * @param mixed $e 待查找的元素的值
	 * @return int
	 * */
	public function getCountForElem($e){
		$allelem=$this->getAllElem();
		$count=0;
		foreach($allelem as $value){
			if($e === $value){
				$count++;
			}
		}
		return $count;
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值