前期写过一个PHP实现单向链表、实现排序单向链表的一篇文章,传送门:http://www.cnblogs.com/yydcdut/p/3777760.html。双向链表写过了,再拿出来提一提:http://www.cnblogs.com/yydcdut/p/3782661.html

这次再来分享一下实现双向链表和栈的实现。代码虽然是以前写的了,但是发现PHP写的这些代码很容易看懂!

双向链表                                                                                      

<?php
//双向链表
class Hero
{
public $pre=null;//前指针
public $no;//排名
public $name;//名字
public $next=null;//后指针 /**
*构造函数,申明链表头
*/
public function __construct($no='',$name='')
{
$this->no=$no;
$this->name=$name;
}
/**
*插入
*/
static public function addHero($head,$hero)
{
$cur = $head;
$isExist=false;
//判断目前这个链表是否为空
if($cur->next==null)
{
$cur->next=$hero;
$hero->pre=$cur;
}
else
{
//如果不是空节点,则安排名来添加
//找到添加的位置
while($cur->next!=null)
{
if($cur->next->no > $hero->no)
{//如果大于了排名,跳出
break;
}
else if($cur->next->no == $hero->no)
{//如果等于排名,则代表有这个元素了
$isExist=true;
echo "<br>不能添加相同的编号";
}
$cur=$cur->next;
}
if(!$isExist)
{//如果元素不存在,执行插入操作
if($cur->next!=null)
{$hero->next=$cur->next;}
$hero->pre=$cur;
if($cur->next!=null)
{$hero->next->pre=$hero;}
$cur->next=$hero;
}
}
}
//遍历
static public function showHero($head)
{
$cur=$head;
while($cur->next!=null)
{
echo "<br>编号:".$cur->next->no."名字:".$cur->next->name;
$cur=$cur->next;
}
}
static public function delHero($head,$herono)
{
$cur=$head;
$isFind=false;
while($cur!=null)
{
if($cur->no==$herono)
{
$isFind=true;
break;
}
//继续找
$cur=$cur->next;
}
if($isFind)
{
if($cur->next!=null)
{$cur->next_pre=$cur->pre;}
$cur->pre->next=$cur->next;
}
else
{echo "<br>没有找到目标";}
}
}
$head = new Hero();
$hero1 = new Hero(1,'1111');
$hero3 = new Hero(3,'3333');
$hero2 = new Hero(2,'2222');
Hero::addHero($head,$hero1);
Hero::addHero($head,$hero3);
Hero::addHero($head,$hero2);
Hero::showHero($head);
Hero::delHero($head,2);
Hero::showHero($head);
?>

双向链表的插入操作示意图:

if($cur->next!=null)
$hero->next=$cur->next;
$hero->pre=$cur;
if($cur->next!=null)
$hero->next->pre=$hero;
$cur->next=$hero;

删除操作示意图:

if($cur->next!=null)
$cur->next->pre=$cur->pre;
$cur->pre->next=$cur->next;

栈                                                                                              

<?php

    class myStack
{
private $top=-1;
private $maxSize=5;
private $stack=array();
public function push($val)
{
if($this->top == $this->maxSize)
{
echo "<br>已经满了";
}
$this->top++;
$this->stack[$this->top]=$val;
} public function showStack()
{
if($this->top==-1)
{
echo "<br>栈为空!";
return ;
}
for($i=$this->top;$i>-1;$i--)
{
echo "<br>stack[".$i."]=".$this->stack[$i];
}
} public function pop()
{
if($this->top==-1)
{
echo "<br>栈为空!";
return ;
} $val=$this->stack[$this->top];
$this->top--;
echo "<br>弹出".$val;
}
} $mystack = new myStack;
$mystack->push('111');
$mystack->push('222');
$mystack->showStack();
$mystack->pop();
$mystack->pop();
?>

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

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

  • 硬堆栈:利用CPU中的某些寄存器组或类似的硬件或使用内存的特殊区域来实现。这类堆栈容量有限,但速度很快;
  • 软堆栈:这类堆栈主要在内存中实现。堆栈容量可以达到很大。在实现方式上,又有动态方式和静态方式两种

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

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

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

栈的链式存储结构称为链栈,是运算受限的单链表。其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。

当然,php中的数组API里面带的有push和pop函数。

我是天王盖地虎的分割线                                                                

《PHP实现链表》传送门:http://www.cnblogs.com/yydcdut/p/3777760.html

转载请注明出处:转载请注明出处:http://www.cnblogs.com/yydcdut

PHP实现双向链表、栈的更多相关文章

  1. Android 面试问答

    Android 面试问答 目录 数据结构和算法 java核心知识 Android核心知识 架构 设计相关问题 相关工具和技术 Android 测试驱动开发 其他 数据结构和算法 ******关于此类问 ...

  2. (2018干货系列八)最新VR学习路线整合

    怎么学VR 即虚拟现实技术,是一种可以创建和体验虚拟世界的计算机仿真系统,它利用计算机生成一种模拟环境,是一种多源信息融合的.交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中.VR/AR/ ...

  3. Python学习的十个阶段,学完神功大成,对应一下看看你自己在哪个阶段

    大家好,我是白云. 今天给大家整理了Python学习的十个阶段内容,看看你现在正处于哪个阶段,想学习的朋友也可以根据这个阶段规划学习. 阶段一:Python基础[ 初入江湖] Linux基础 目标: ...

  4. ACM/ICPC 之 用双向链表 or 模拟栈 解“栈混洗”问题-火车调度(TSH OJ - Train)

    本篇用双向链表和模拟栈混洗过程两种解答方式具体解答“栈混洗”的应用问题 有关栈混洗的定义和解释在此篇:手记-栈与队列相关 列车调度(Train) 描述 某列车调度站的铁道联接结构如Figure 1所示 ...

  5. 4-29 c语言之栈,队列,双向链表

    今天学习了数据结构中栈,队列的知识 相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO). 首先看一下栈(St ...

  6. hdu4699 Editor(双向链表或双栈对弹)

    本题就是两个要点: 1.数据结构的设计.显然可以使用双向链表来做,但是写双向链表的代码复杂度高.其实更好的方法是使用两个对弹的栈来做,而且没必要用STL的栈,就自己开两个数组简单搞一下就好了. 2.最 ...

  7. 笔试算法题(05):转换BST为双向链表 & 查找栈中的最小元素

    出题:把二元查找树转变成排序的双向链表.输入一棵二元查找树,要求将该二元查找树按照中序转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整指针的指向: 分析: 递归的思路,当前节点需要进行的处 ...

  8. c++用双向链表实现模板栈

      可直接编译运行,其中方法status为形象的显示出栈的结构: // visual stack , need define "cout<<" #include < ...

  9. PHP算法学习(7) 双向链表 实现栈

    2019年2月25日17:24:34 final class BasicNode { public $index; public $data; public $next = null; public ...

随机推荐

  1. Java经典设计模式之七大结构型模式

    转载: Java经典设计模式之七大结构型模式 博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以 ...

  2. ADO.NET怎删改+vs 2013 C#

    一.删除 string constr = "server=.;database=test;uid=sa;pwd=sa";            SqlConnection myco ...

  3. 429.N叉树的层次遍历

    给定一个 N 叉树,返回其节点值的层序遍历. (即从左到右,逐层遍历). 例如,给定一个 3叉树 : 返回其层序遍历: [ [1], [3,2,4], [5,6] ] 说明: 树的深度不会超过 100 ...

  4. 洛谷P2047 [NOI2007]社交网络 [图论,最短路计数]

    题目传送门 社交网络 题目描述 在社交网络(social network)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题.在一个社交圈子里有n个人,人与人之间有不同程度的关系. ...

  5. git 免密码配置

    1.cd ~/ 2.touch .git-credentials   (注意文件名前面有个  ”点”) 3.打开刚刚创建的文件,写入 https://username:password@github. ...

  6. Typora ---一款简洁的Markdown编辑器

    Typora BB in front 如果你是一个佛(lan)系(duo),内心文艺的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,可以来了解一下该软件Typora. What ...

  7. nyoj 214 单调递增子序列(二)

    单调递增子序列(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 ,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度. ...

  8. MySQL 之 多表查询

    一.多表联合查询 #创建部门CREATE TABLE IF NOT EXISTS dept ( did int not null auto_increment PRIMARY KEY, dname V ...

  9. 【UOJ #104】【APIO 2014】Split the sequence

    http://uoj.ac/problem/104 此题的重点是答案只与切割的最终形态有关,与切割顺序无关. 设\(f(i,j)\)表示前\(i\)个元素切成\(j\)个能产生的最大贡献. \(f(i ...

  10. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...