刚入手了一本《程序员代码面试指南》,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象。

题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作

要求:

① pop、push、getMin 操作的时间复杂度都是 O(1)

② 设计的栈类型可以使用现成的栈结构

PHP 当中没有栈和队列的概念(5.3 以后增加了 SplStack 类),但是可以用数组来模拟栈和队列,用到的方法有 array_push 和 array_pop

array_push:向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度

array_pop:array_pop() 函数删除并返回数组中的最后一个元素

代码:

 <?php

 class MyStack1 {

     //普通栈
private $stackData = array();
//保存每一步最小值的栈
private $stackMin = array(); //向栈中压入数据
public function push($newNum) {
//向保存最小值的栈中压入数据
if(empty($this->stackMin)) {
array_push($this->stackMin, $newNum);
}else if($newNum <= $this->getMin()) {
array_push($this->stackMin, $newNum);
}
//向普通栈中压入数据
array_push($this->stackData, $newNum);
} //弹出栈顶元素
public function pop(){ try {
if(empty($this->stackData)) {
throw new Exception('Your stack is empty.');
}else{
//普通栈出栈
while(!empty($this->stackData)) {
$val = array_pop($this->stackData);
if($val == $this->getMin()) {
$value = $val;
}
}
return $value;
}
}catch(Exception $e) {
echo $e->getMessage();
}
} //返回栈中的最小元素
public function getMin() { try {
if(empty($this->stackMin)) {
throw new Exception('Your stack is empty.');
}else{
//返回栈顶元素
$count = count($this->stackMin);
return $this->stackMin[$count - 1];
}
}catch(Exception $e) {
echo $e->getMessage();
}
} //查看普通栈
public function getStackData() {
return $this->stackData;
} //查看保存最小值的栈
public function getStackMin() {
return $this->stackMin;
}
}

实例化并查看最小值:

$myStack1 = new MyStack1();

$myStack1->push(3);
$myStack1->push(4);
$myStack1->push(5);
$myStack1->push(1);
$myStack1->push(2);
$myStack1->push(1);
$myStack1->push(6); echo '弹出之前<br />';
echo 'StackData:';
var_dump($myStack1->getStackData());
echo 'StackMin:';
var_dump($myStack1->getStackMin()); echo '**********<br />';
echo '最小值是:',$myStack1->pop(),'<br />';
echo '**********<br /><br />'; echo '弹出之后<br />';
echo 'StackData:';
var_dump($myStack1->getStackData());
echo 'StackMin:';
var_dump($myStack1->getStackMin());

输出:

弹出之前
StackData:
array
0 => int 3
1 => int 4
2 => int 5
3 => int 1
4 => int 2
5 => int 1
6 => int 6
StackMin:
array
0 => int 3
1 => int 1
2 => int 1
**********
最小值是:1
********** 弹出之后
StackData:
array
empty
StackMin:
array
0 => int 3
1 => int 1
2 => int 1

算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈的更多相关文章

  1. 栈和队列----设计一个有getMin功能的栈

    设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ...

  2. 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈

    题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ...

  3. 设计一个有getMin功能的栈

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“设计一个有getMin功能的栈”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明 ...

  4. 常见面试算法题JS实现-设计一个有getMin功能的栈

    前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ...

  5. 栈和队列问题:设计一个有 getMin 功能的栈

    [知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ...

  6. 设计一个有getMin功能的栈(1)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...

  7. 设计一个带有getmin功能的栈,保证时间复杂度在O(1)

    2017-06-22  20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ...

  8. 设计一个有getMin功能的栈(2)

    题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ...

  9. stack_1.设计一个有getMin功能的栈

    思路 : 生成两个栈($stack ,$stack_min ),往$stack塞数据($value)的时候 ,比较一下$value和$stack_min最上面的元素的大小,如果$value小,则压入$ ...

随机推荐

  1. 封装自己的ajax函数

    url为具体的url地址, onsuccess为正常返回时的结果, onfail为错误返回时的结果 function MyAjax(url,onsuccess,onfail) { var xhr = ...

  2. BroadcastReceiver应用详解(转)

    转自: http://blog.csdn.net/liuhe688/article/details/6955668 問渠那得清如許?為有源頭活水來.南宋.朱熹<觀書有感> 据说程序员是最爱 ...

  3. ML 03、机器学习的三要素

    机器学习算法原理.实现与实践——机器学习的三要素 1 模型 在监督学习中,模型就是所要学习的条件概率分布或决策函数.模型的假设空间包含所有可能的条件概率分布或决策函数.例如,假设决策函数是输入变量的线 ...

  4. PHPExcel 类

    //引入工具类 require_once 'PHPExcel.php'; //HandleExcel.class.php 文件 class HandleExcel extends PHPExcel{ ...

  5. Oracle查询表里的重复数据方法:

    一.背景 一张person表,有id和name的两个字段,id是唯一的不允许重复,id相同则认为是重复的记录. 二.解决 select id from group by id having count ...

  6. java中异步多线程超时导致的服务异常

    在项目中为了提高大并发量时的性能稳定性,经常会使用到线程池来做多线程异步操作,多线程有2种,一种是实现runnable接口,这种没有返回值,一种是实现Callable接口,这种有返回值. 当其中一个线 ...

  7. 一个DIV三列布局100%高度自适应的好例子(国外)

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W ...

  8. POJ1135 Domino Effect(SPFA)

    题目大概是,普通骨牌连接两张关键骨牌,一旦一张关键骨牌倒下与其相邻的普通骨牌也倒下,普通骨牌倒下与其相邻的骨牌也倒下.给出所有有普通骨牌相连的两个关键骨牌之间普通骨牌倒下所需时间,问1号关键骨牌开始倒 ...

  9. 2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild

    Rebuild Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total S ...

  10. BZOJ2216 : [Poi2011]Lightning Conductor

    $f[i]=\max(a[j]+\lceil\sqrt{|i-j|}\rceil)$, 拆开绝对值,考虑j<i,则决策具有单调性,j>i同理, 所以可以用分治$O(n\log n)$解决. ...