数据结构与算法之PHP实现队列、栈

<?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();

<?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实现队列、栈的更多相关文章
- 数据结构和算法 – 3.堆栈和队列
1.栈的实现 后进先出 自己实现栈的代码 using System; using System.Collections.Generic; using System.Linq; using ...
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
- JS数据结构及算法(二) 队列
队列是遵循先进先出的一种数据结构,在尾部添加新元素,并从顶部移除元素. 1.普通队列 function Queue() { this.items = []; } Queue.prototype = { ...
- 《数据结构与算法之美》 <06>栈:如何实现浏览器的前进和后退功能?
浏览器的前进.后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面 a-b-c 之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面 b 和 a.当你后退到页面 a,点击前进按钮,就可以重新查看页 ...
- 数据结构与算法(3)----->队列和栈
1. 栈和队列的基本性质 栈是先进后出;(像是子弹夹,后进先打出) 队列是先进先出;(像是平时排队买冰淇淋,按顺序轮流) 栈和队列在实现的结构上可以有数组和链表两种形式; (1)数组结构实现容易; ( ...
- Java数据结构和算法(五)——队列
前面一篇博客我们讲解了并不像数组一样完全作为存储数据功能,而是作为构思算法的辅助工具的数据结构——栈,本篇博客我们介绍另外一个这样的工具——队列.栈是后进先出,而队列刚好相反,是先进先出. 1.队列的 ...
- 《Java数据结构与算法》笔记-CH4-2用栈实现字符串反转
import java.io.BufferedReader; import java.io.InputStreamReader; //用栈来实现一个字符串逆序算法 /** * 数据结构:栈 */ cl ...
- 用Python实现的数据结构与算法:双端队列
一.概述 双端队列(deque,全名double-ended queue)是一种具有队列和栈性质的线性数据结构.双端队列也拥有两端:队首(front).队尾(rear),但与队列不同的是,插入操作在两 ...
- 数据结构与算法JavaScript描述——使用队列
1.使用队列:方块舞的舞伴分配问题 前面我们提到过,经常用队列模拟排队的人.下面我们使用队列来模拟跳方块舞的人.当 男男女女来到舞池,他们按照自己的性别排成两队.当舞池中有地方空出来时,选两个队 列中 ...
随机推荐
- .Net Core之Swagger
1.项目生成xml 2.添加链接文件,并将属性设值为始终复制 3.添加swagger引用:Swashbuckle.AspNetCore 4.startup.cs配置swargger的xml来源: Co ...
- java中Properties类及读取properties中属性值
本文为博主原创,未经允许不得转载: 在项目的应用中,经常将一些配置放入properties文件中,在代码应用中读取properties文件,就需要专门的类Properties类,通过这个类可以进行读取 ...
- Jmeter工具
开源,纯java,用于HTTP协议性能测试,接口协议测试工具,自动化测试工具 功能测试角度: 1.支持多种不同类型的协议.接口协议有多种 2.可以全面支持HTTP协议(后台交互) 3.其他非直接支持的 ...
- C# 委托例子
两个子窗口向一个主窗口发送信息 主窗口: using System; using System.Collections.Generic; using System.ComponentModel; us ...
- 【Python】【电子邮箱】
#[[电子邮件]]'''Email的历史比Web还要久远,直到现在,Email也是互联网上应用非常广泛的服务. 几乎所有的编程语言都支持发送和接收电子邮件,但是,先等等,在我们开始编写代码之前,有必要 ...
- 【selenium2】【selenium基础语法】
#栗子 设置浏览器窗口大小 driver.set_window_size(480,800) #栗子 设置浏览器大小为最大maximize_window() 控制浏览器前进.后退 #栗子from sel ...
- 性能跃升50%!解密自主研发的金融级分布式关系数据库OceanBase 2.0
小蚂蚁说: 相信大家对蚂蚁金服自主研发的金融级分布式关系数据库OceanBase的故事不再陌生了.在刚刚过去的2018年天猫双11中,成交额2135亿再次创造了新纪录,而支撑今年双11的支付宝核心链路 ...
- 【BZOJ】3575: [Hnoi2014]道路堵塞
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3575 大概的做法是,按照顺序枚举每一条要删去的边,(假设当前点为$u$,在最短路径上的下一 ...
- 51nod 1185 || 51nod 1072 威佐夫博弈
贴个模板:平常的跟高精度java的: int: #pragma comment(linker, "/STACK:1024000000,1024000000") #include&l ...
- 给大一新生学习c程序的一些建议的一些建议
这是一篇给刚学习c程序的学弟们的一篇日志.如果想学好c程序,以及不想走太多弯路,希望能看一下这篇文章,如果说基础较好,或者说已经是大二,大三,这篇文章不会有什么帮助. 刚转到软件工程系,加了几个新生群 ...