一、队列
1)队列(Queue)是一种先进先出(FIFO)的线性表,它只允许在表的前端进行删除操作,在表的后端进行插入操作,进行插入操作的端称为队尾,进行删除操作的端称为队头。即入队只能从队尾入,出队只能从队头出。
2)队列一般拥有队首(front指针)和队尾(rear指针),当一个队列并未存入数据的时候,front和rear指针均指向队首。
3)入队操作:rear后移,存入数据在rear指向的单元,队满不可入队,这同时也表明front总是指向队首元素的前驱。
4)出队操作:front后移,元素出队,队空不可出队。
5)在PHP函数中,array_push函数是向数组尾部添加元素,即入队操作;array_shift函数是删除数组头部元素,即出队操作。
$array =  array('a', 'b');
array_push($array, 'c'); //入队
array_shift($array);     //出队
队列的数组实现
<?php
/**
* php用数组实现队列:先进先出FIFO
1. getLength(): 获得队列的长度
2. isEmpty(): 判断队列是否为空
3. enqueue(): 入队,在队尾加入数据。
4. dequeue(): 出队,返回并移除队首数据。队空不可出队。
5. show(): 遍历队列,并输出
6. clear(): 清空队列
*/
class Queue {
// 队列数组
public $dataStore = array(); // 获得队列的长度
public function getLength() {
return count($this->dataStore);
}
// 判断队列是否为空
public function isEmpty() {
return $this->getLength() === 0;
}
// 入队,在队尾加入数据。
public function enqueue($element) {
$this->dataStore[] = $element;
// array_push($this->dataStore, $element);
}
// 出队,返回并移除队首数据。队空不可出队。
public function dequeue() {
if (!$this->isEmpty()) {
return array_shift($this->dataStore);
}
return false;
}
// 遍历队列,并输出
public function show() {
if (!$this->isEmpty()) {
for ($i = 0; $i < $this->getLength(); $i++) {
echo $this->dataStore[$i] . PHP_EOL;
}
} else {
return "空";
}
}
// 清空队列
public function clearQueue() {
unset($this->dataStore);
// $this->dataStore = array();
}
}
// 测试
$q = new Queue();
$q->enqueue('a');
$q->enqueue('b');
$q->enqueue('c');
echo '队列的长度为:' . $q->getLength();
echo "</br>";
echo '队列为:';
$q->show();
echo "</br>";
$q->dequeue();
echo "</br>";
echo "a出队,队列为:";
$q->show();
$q->clearQueue();
echo "清空队列后,队列为" . $q->show();

队列的链表实现

创建链式队列时,需定义两个结构,一个用于描述节点,一个用于描述队列。
<?php
/**
* php用链表实现队列:先进先出FIFO
1. isEmpty(): 判断队列是否为空
2. enqueue(): 入队,在队尾加入数据。
3. dequeue(): 出队,返回并移除队首数据。队空不可出队。
4. clear(): 清空队列
5. show(): 显示队列中的元素
*/
// 节点类
class Node {
public $data; // 节点数据
public $next; // 下一节点 public function __construct($data) {
$this->data = $data;
$this->next = NULL;
}
}
// 队列类
class Queue {
private $header; // 头节点 function __construct($data) {
$this->header = new Node($data);
}
// 判断队列是否为空
public function isEmpty() {
if ($this->header->next !== null) { // 不为空
return false;
}
return true;
}
// 入队,在队尾加入数据。
public function enqueue($element) {
$newNode = new Node($element);
$current = $this->header;
if ($current->next == null) { // 只有头节点
$this->header->next = $newNode;
} else { // 遍历到队尾最后一个元素
while ($current->next != null) {
$current = $current->next;
}
$current->next = $newNode;
}
$newNode->next = null;
}
// 出队,返回并移除队首数据。队空不可出队。
public function dequeue() {
if ($this->isEmpty()) { // 队列为空
return false;
}
// header头节点没有实际意义,队首节点是header指向的结点。
$current = $this->header;
$current->next = $current->next->next;
}
// 清空队列
public function clear() {
$this->header = null;
}
// 显示队列中的元素
public function show() {
$current = $this->header;
if ($this->isEmpty()) {
echo "空!";
}
while ($current->next != null) {
echo $current->next->data . PHP_EOL;
$current = $current->next;
}
}
}
// 测试
$q = new Queue('header');
$q->enqueue('a');
$q->enqueue('b');
$q->enqueue('c');
echo "队列为:";
$q->show();
echo "</br>";
echo "a出队,队列为:";
$q->dequeue();
$q->show();
echo "</br>";
$q->clear();
echo "清空队列后,队列为";
$q->show();
 
二、栈
1)栈(Stack)是一种后进先出(LIFO)表,插入删除操作都只能在一个位置上进表,这个位置位于表的末端,叫做栈顶(Top),另一端则称为栈底(Bottom),又称为表头。
2)对栈的基本操作有push和pop,表示进栈和出栈,相当于插入和删除操作。存储数据时,先进入的数据被压入栈底,后进入的数据则在栈顶;读取数据时,从栈顶开始弹出数据。
3)在PHP函数中,array_push函数是向数组尾部添加元素,即入栈操作;array_pop函数是删除数组尾部元素,即出栈操作。
$array =  array('a', 'b');
array_push($array, 'c'); //入栈
array_pop($array);       //出栈
栈的数组实现
选择用数组表示栈内容必须预先估计栈的最大容量。因为数组一旦创建,其大小是无法改变的,而数组设置过大可能会浪费大量内存,设置过小又可能会溢出。
<?php
/**
* php用数组实现栈:后入先出LIFO
1. getLength(): 获得栈的长度
2. push(): 入栈,在最顶层加入数据。
3. pop(): 出栈,返回并移除最顶层的数据。
4. getTop(): 返回最顶层数据的值,但不移除它
5. clearStack(): 清空栈
6. show(): 遍历栈元素
*/
class Stack {
// 使用数组实现栈结构
public $stack = array(); // 获得栈的长度
public function getLength() {
return count($this->stack);
}
// 入栈,在最顶层加入数据。
public function push($element) {
$this->stack[] = $element;
}
// 出栈,返回并移除最顶层的数据。
public function pop() {
if ($this->getLength() > 0) {
return array_pop($this->stack);
}
}
// 返回最顶层数据的值,但不移除它
public function getTop() {
$top = $this->getLength() - 1;
return $this->stack[$top];
}
// 清空栈
public function clearStack() {
unset($this->stack);
// $this->stack = array();
}
// 遍历栈元素
public function show() {
if ($this->getLength() > 0) {
for ($i = 0; $i < $this->getLength(); $i++) {
echo $this->stack[$i] . PHP_EOL;
}
}
echo "空!";
}
}
// 测试
$s = new Stack();
$s->push('a');
$s->push('b');
$s->push('c');
echo "栈为:";
$s->show();
echo "</br>";
echo '栈顶元素为' . $s->getTop();
echo "</br>";
echo '栈的长度为:' . $s->getLength();
echo "</br>";
$s->pop();
echo "出栈,弹出c,栈为:";
$s->show();
echo "</br>";
echo "清空栈,栈为:";
$s->clearStack();
$s->show();

栈的链表实现

<?php
/**
* php用数组实现栈:后入先出LIFO
1. isEmpty(): 判断队列是否为空。
2. push(): 入栈,插入新的栈顶节点
3. pop(): 出栈,删除栈顶元素
4. clear(): 清空栈
5. show(): 遍历栈元素
*/
// 节点类
class Node {
public $data; // 节点数据
public $next; // 下一节点 public function __construct($data) {
$this->data = $data;
$this->next = NULL;
}
}
class Stack {
private $header; // 头节点 function __construct($data) {
$this->header = new Node($data);
} // 判断栈是否为空
public function isEmpty() {
if ($this->header->next !== null) { // 不为空
return false;
}
return true;
}
// 入栈,插入新的栈顶节点
public function push($element) {
$newNode = new Node($element);
$current = $this->header;
if ($current->next == null) { // 只有头节点
$this->header->next = $newNode;
} else { // 遍历到栈尾最后一个元素
while ($current->next != null) {
$current = $current->next;
}
$current->next = $newNode;
}
$newNode->next = null;
}
// 出栈,删除栈顶元素
public function pop() {
if ($this->isEmpty()) { // 栈为空
return false;
}
$current = $this->header;
while ($current->next->next != null) {
$current = $current->next;
}
$current->next = null;
}
// 清空栈
public function clear() {
$this->header = null;
}
// 显示栈中的元素
public function show() {
$current = $this->header;
if ($this->isEmpty()) {
echo "空!";
}
while ($current->next != null) {
echo $current->next->data . PHP_EOL;
$current = $current->next;
}
}
}
// 测试
$s = new Stack('header');
$s->push('a');
$s->push('b');
$s->push('c');
echo "栈为:";
$s->show();
echo "</br>";
$s->pop();
echo "出栈,弹出c,栈为:";
$s->show();
echo "</br>";
echo "清空栈,栈为:";
$s->clear();
$s->show();

数据结构与算法之PHP实现队列、栈的更多相关文章

  1. 数据结构和算法 – 3.堆栈和队列

    1.栈的实现   后进先出     自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...

  2. JavaScript 版数据结构与算法(二)队列

    今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...

  3. JS数据结构及算法(二) 队列

    队列是遵循先进先出的一种数据结构,在尾部添加新元素,并从顶部移除元素. 1.普通队列 function Queue() { this.items = []; } Queue.prototype = { ...

  4. 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?

    浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...

  5. 数据结构与算法(3)----->队列和栈

    1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...

  6. Java数据结构和算法(五)——队列

    前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...

  7. 《Java数据结构与算法》笔记-CH4-2用栈实现字符串反转

    import java.io.BufferedReader; import java.io.InputStreamReader; //用栈来实现一个字符串逆序算法 /** * 数据结构:栈 */ cl ...

  8. 用Python实现的数据结构与算法:双端队列

    一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...

  9. 数据结构与算法JavaScript描述——使用队列

    1.使用队列:方块舞的舞伴分配问题 前面我们提到过,经常用队列模拟排队的人.下面我们使用队列来模拟跳方块舞的人.当 男男女女来到舞池,他们按照自己的性别排成两队.当舞池中有地方空出来时,选两个队 列中 ...

随机推荐

  1. A successful Git branching model——经典篇

    A successful Git branching model In this post I present the development model that I’ve introduced f ...

  2. 一、python (int & str 的方法)

    1.变量:命名与使用 #!/usr/bin/env/ python # -*- coding:utf-8 -*- name = 'liQM' 只能包含字母.数字或下划线: 第一个字符不能是数字: 简短 ...

  3. Linux 命令之mv

    mv命令也是Linux中很常见命令 作用:可以用来移动文件或者将文件改名 命令格式: mv [选项] 源文件或目录 目标文件或目录 命令参数: -b :若需覆盖文件,则覆盖前先行备份. -f :for ...

  4. http协议的状态码解释

    一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  5. 【Ruby】【基础】

    # [Ruby 块]=begin1 块由大量代码构成2 块中代码包含在{}内3 从与其相同名称的函数调用4 可以使用yield语句调用块=enddef test p '在test方法内' yield ...

  6. Easy Graphics Engine vs2015使用

    vs2017: 下载 https://pan.baidu.com/s/1qWxAgeK 里面的 “ege19.01_vs2017 (推荐, 修正win10 1809 上无法正常运行的问题).zip”  ...

  7. Mysql简单入门

    这两天比较懒,没有学习,这个是我问一个学java的小伙伴要的sql的总结资料,大体语句全在上面了,复制到博客上,以后忘记可以查看 #1命令行连接MySQLmsyql -u root -proot;#2 ...

  8. 详解Vue中watch的高级用法

    我们通过实例代码给大家分享了Vue中watch的高级用法,对此知识点有需要的朋友可以跟着学习下. 假设有如下代码: <div> <p>FullName: {{fullName} ...

  9. Teams UVA - 11609

    题意就不多说了这个小规律不算难,比较容易发现,就是让你求一个数n*2^(n-1):很好想只是代码实现起来还是有点小困(简)难(单)滴啦,一个快速幂就OK了: 代码: #include<stdio ...

  10. python静态方法、类方法

    常规: class Dog(object): def __init__(self,name): self.name=name def eat(self): print('%s is eating'%s ...