PHP数据结构之五 栈的PHP的实现和栈的基本操作
栈
栈在计算机的实现有多种方式:
硬堆栈:利用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=gb2312");
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;
}
}
echo "<pre>";
$sl=new StackLinked();
var_dump($sl->getIsEmpty());
$sl->getPushStack(12);
$sl->getPushStack(255);
var_dump($sl->getIsEmpty());
var_dump($sl->getAllElem());
echo $sl->getLength();
$e=0;
echo "\r\n";
var_dump($sl->getIsEmpty());
echo "\r\n";
$sl->getPopStack($e);
echo $e;
echo "\r\n";
echo $sl->getLength();
echo "\r\n";
var_dump($sl->getAllElem());
var_dump($sl->getAllPopStack());
var_dump($sl->getIsEmpty());
var_dump($sl->getLength());
echo "</pre>";
?>
PHP数据结构之五 栈的PHP的实现和栈的基本操作的更多相关文章
- JavaScript中的数据结构及实战系列(2):栈
开题: 不冒任何险,什么都不做,什么也不会有,什么也不是. 本文目录 栈介绍: JavaScript实现栈: 栈的应用: 栈介绍: 和队列一样,栈也是一种表结构,但是和队列的"先进先出&qu ...
- <数据结构基础学习>(三)Part 1 栈
一.栈 Stack 栈也是一种线性的数据结构 相比数组,栈相对应的操作是数组的子集. 只能从一端添加元素,也只能从一端取出元素.这一端成为栈顶. 1,2,3依次入栈得到的顺序为 3,2,1,栈顶为3, ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- SDUT-3334_数据结构实验之栈与队列七:出栈序列判定
数据结构实验之栈与队列七:出栈序列判定 Time Limit: 30 ms Memory Limit: 1000 KiB Problem Description 给一个初始的入栈序列,其次序即为元素的 ...
- 数据结构 1 线性表详解 链表、 栈 、 队列 结合JAVA 详解
前言 其实在学习数据结构之前,我也是从来都没了解过这门课,但是随着工作的慢慢深入,之前学习的东西实在是不够用,并且太皮毛了.太浅,只是懂得一些浅层的,我知道这个东西怎么用,但是要优化.或者是解析,就不 ...
- 算法与数据结构题目的 PHP 实现:栈和队列 由两个栈组成的队列
思路:同样使用 PHP 的数组模拟栈.栈的特点是先进后出,队列的特点是先进先出,可以用第一个栈(StackPush)作为压入栈,压入数据的时候只往这个栈中压入数据,第二个栈作(StackPop)为弹出 ...
- 数据结构与算法之PHP实现队列、栈
一.队列 1)队列(Queue)是一种先进先出(FIFO)的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头.即入队只能从队尾入,出队 ...
- 数据结构&算法(一)_堆、栈(堆栈)、队列、链表
堆: ①堆通常是一个可以被看做一棵树的数组对象.堆总是满足下列性质: ·堆中某个节点的值总是不大于或不小于其父节点的值: ·堆总是一棵完全二叉树.将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做 ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
随机推荐
- 同一局域网环境下的arp欺骗和中间人攻击(mac)
最近读了一篇有关arp欺骗和中间人攻击的文章,于是乎就想着自己实现一下,顺便验证下微信在回话劫持后的安全性. 1.本机环境 Macbook Air:OS X 10.11 El Captain 2.推荐 ...
- ubuntu 上查看文件的内容,二进制形式展现
Vim 可以用来查看和编辑二进制文件 vim -b egenea-base.ko 加上-b参数,以二进制打开 然后输入命令 :%!xxd -g 1 切换到十六进制模式显示
- c语言编译执行过程
<h4>认识C编译执行过程</h4>认识C编译执行过程,是C学习的开端.简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标 ...
- Java中Set,List,Map的区别
java集合的主要分为三种类型: Set(集) List(列表) Map(映射) 1.1 Collection接口 Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和 ...
- ARP表 MAC表 路由表
ARP表是一个动态表,存储在计算机当中,目的是做一个ip地址与mac地址的对应.假设在同一子网段,计算机A与计算机B通信计算机A的ip地址192.168.0.1 MAC地址AA-AA-AA-AA-AA ...
- 洛谷 P1930 亚瑟王的宫殿 Camelot
传送门 题目大意:棋盘有骑士有王,让所有点跳到一个点,求所有棋子跳的步数和,和最小. 题解:bfs+枚举 王的人生: 1):自己走到聚集点 2):某个骑士来到王这里,两个棋子一起到聚集点 3):王走几 ...
- js客户端UI框架
Best jQuery UI http://b-jui.com/ jQuery EasyUI http://www.jeasyui.com/ bootstrap学习网: http://www.runo ...
- PCB 锣板和半孔工艺的差别
PCB 锣板和半孔工艺的差别 PCB 在做模块时会用到半孔工艺,但是由于半孔是特殊工艺. 需要加费用,打板时费还不低. 下面这个图是锣板和半孔工艺的差别. https://www.amobbs.com ...
- Java-Runoob:Java 简介
ylbtech-Java-Runoob:Java 简介 1.返回顶部 1. Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java ...
- docker 及 linux 初接触
3天来净折腾这俩东西了,总结一下(很多都是同事给出的解释,先不保证正确性): 1.docker 里的images 和 container images 类似系统盘,container类似用系统盘装起来 ...