php数据结构课程---4、栈(是什么)

一、总结

一句话总结:

栈(stack),它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。

1、栈的链表实现?

定义node,设置属性data,prev
定义stack类,设置栈顶top,size
编写出栈push(),pop()函数
返回栈所有数据函数getAll()
<?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());

2、数组模拟栈?

array_push() array_pop()
//数组模拟栈

$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);

3、括号匹配应用(比如[[()]()])?

算法思路:如果是左边的括号,就将对应的右括号押进栈,如果是右边的括号,判断栈里面是否有这个括号,没有说明不匹配
<?php 

$stack =  new SplStack();

$str = "[[[]](){}]";
echo $str."</br>";
$symbols =["("=>")","["=>"]","{"=>"}"];
// $keys =["(","[","{"];
// $values = [")","]","}"]; $result = "匹配";
for ($i=0; $i < strlen($str) ; $i++) {
if(in_array($str[$i], array_keys($symbols))){
$stack->push($symbols[$str[$i]]);
}else if(in_array($str[$i], array_values(($symbols)))){
if(!$stack->isEmpty()){
if($str[$i] != $stack->pop()){
$result = "不匹配!";
break;
}
}else{
$result = "不匹配!";
break;
}
}
}
if($stack->isEmpty()){
echo $result;
}else{
echo "不匹配!!";
} // $stack = new SplStack();
// $str = "[[()][]";
// // $str = "[()][]]";
// echo $str."</br>"; // for ($i=0; $i < strlen($str); $i++) {
// if ($str[$i] == "[") {
// $stack->push("]");
// }elseif ($str[$i] == "(") {
// $stack->push(")");
// }elseif ($str[$i] == ")") {
// if(!$stack->isEmpty()){
// $pop = $stack->pop();
// if($pop != ")"){
// echo "not match!";exit;
// }
// }else{
// echo "not match!";exit;
// }
// }elseif ($str[$i] == "]") {
// if(!$stack->isEmpty()){
// $pop = $stack->pop();
// if($pop != "]"){
// echo "not match!";exit;
// }
// }else{
// echo "not match!";exit;
// }
// }
// }
// if($stack->isEmpty()){
// echo "匹配!";
// }else{
// echo "不匹配!!";
// }

4、八皇后的栈实现(不在同一条横线,竖线,左斜线,右斜线上)?

已选取的元素存入栈
判断左右斜线:$i和$j的差值
<?php 

class Queen{
// 多少皇后
public $n;
// 记录多少种摆法
public $count;
//栈
public $stack; public function __construct($n=8){
$this->n=$n;
$this->stack = new SplStack();
} //摆放n皇后
public function place($n=8){
//结束条件,找到一个解
if($this->stack->count() == $this->n ){
$this->count++;
$this->map($this->stack);
return;
}
//摆放第n个皇后,探索水平方向值
for ($i=0; $i < $this->n ; $i++) {
//探索水平位置,值为$i
$this->stack->push($i);
if($this->check()){
$this->place($n-1);
}
//探索水平位置下个值
$this->stack->pop();
}
} public function check(){
for ($i=1; $i < $this->stack->count() ; $i++) {
if($this->stack[$i] == $this->stack[0] || abs($this->stack[$i]-$this->stack[0]) == $i){
return false;
}
}
return true;
}
public function map(){
echo "<table>";
for ($i=0; $i < $this->n; $i++) {
echo "<tr>";
for ($j=0; $j < $this->n; $j++) {
echo "<td>";
if($this->stack[$i]==$j){
echo "Q";
}
echo "</td>";
}
echo "</tr>";
}
echo "</table>";
} } $n=8;
$q = new Queen($n);
$q->place($n);
echo "<table><tr><td class='count'>一共有 $q->count 个摆法。</td></tr></table>";
?>
<style>
table{
margin:15px 15px;
float:left;
}
td{
width: 15px;
height: 15px;
border:1px solid red;
}
.count{
width:150px;
}
</style>

5、用php敲算法问题的好处是什么?

结果可以以网页的形式美观的打印出来

二、内容在总结中

 

php数据结构课程---4、栈(是什么)的更多相关文章

  1. php数据结构课程---1、数据结构基础介绍(程序是什么)

    php数据结构课程---1.数据结构基础介绍(程序是什么) 一.总结 一句话总结: 程序=数据结构+算法 设计好数据结构,程序就等于成功了一半. 数据结构是程序设计的基石. 1.数据的逻辑结构和物理结 ...

  2. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  3. JavaScript数据结构和算法----栈

    前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...

  4. 数据结构学习之栈求解n皇后问题

    数据结构学习之栈求解n皇后问题 0x1 目的 ​ 深入掌握栈应用的算法和设计 0x2 内容 ​ 编写一个程序exp3-8.cpp求解n皇后问题. 0x3 问题描述 即在n×n的方格棋盘上,放置n个皇后 ...

  5. Javascript数据结构与算法--栈的实现与用法

    栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...

  6. JavaScript数据结构与算法-栈练习

    栈的实现 // 栈类 function Stack () { this.dataStore = []; this.top = 0; // 栈顶位置 相当于length,不是索引. this.push ...

  7. php数据结构课程---3、队列(队列实现方法)

    php数据结构课程---3.队列(队列实现方法) 一.总结 一句话总结: 1.数据实现:适用于功能不复杂的情况 2.链表实现:受限链表,只能队头队尾操作:适用于功能复杂情况 1.队列的数组实现注意点? ...

  8. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))

    php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...

  9. SDUT 2133 数据结构实验之栈三:后缀式求值

    数据结构实验之栈三:后缀式求值 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 对于一个基于二元运算符的后缀表示式(基本操作数都是 ...

随机推荐

  1. iOS 解决TableView reloadData时cell中图片会闪的问题

    tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...

  2. [译]GLUT教程 - 键盘

    Lighthouse3d.com >> GLUT Tutorial >> Input >> Keyboard GLUT可以让应用程序自动监测键盘输入,包括普通按键和 ...

  3. watch 命令

    watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...

  4. PorterDuffXferMode不对的真正原因PorterDuffXferMode深入试验)

    菜鸡wing遇敌PorterDuffXferMode,不料过于轻敌,应战吃力. 随后与其大战三天三夜.三百余回合不分胜负. 幸得 @咪咪控 相助,侥幸获胜. keyword:PorterDuffXfe ...

  5. 交易应用及网站驱动不兼容Windows 10的解决方案

        微软公司于2015年7月29日正式发布了Windows 10操作系统.全球范围内已有数以千万计的用户踊跃地升级到了Windows 10,在新用户享受Windows 10所带来的全新使用体验的同 ...

  6. git学习之安装(二)

    安装Git 最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和 ...

  7. 嵌入式开发之davinci--- 8148/8168/8127 中的High-DefinitionVideo Processing Subsystem (HDVPSS)

    High-DefinitionVideo Processing Subsystem (HDVPSS) 这一章介绍了高清视频处理子系统(HDVPSS). 2.1导论 2.1.1 简介 HDVPSS 使用 ...

  8. XSD文件详解

    XSD (xml Schema Definition) Xml Schema的用途 1.  定义一个Xml文档中都有什么元素 2.  定义一个Xml文档中都会有什么属性 3.  定义某个节点的都有什么 ...

  9. 解决php函数json_encode转换后中文被编码为unicode

    大家都知道使用函数json_encode()可以方便快捷地将数组进行json编码转换,但是如果数组值存在着中文,json_encode会将中文转换为unicode编码,例如: <?PHP $ar ...

  10. linux系统之间基于密钥对免输入密码登陆

    通常,我们登陆到一台linux主机是需要输入密码,这样可以验证登陆者的身份. 这篇随笔里面我打算记录一下配置基于ssh密钥对登陆系统.在配置之前先和大家说明一下我遇到过的问题:刚接触到linux时候首 ...