用PHP解决的一个栈的面试题


Posted in PHP onJuly 02, 2014

前言

遇到一道面试题,题目大概意思如下:

使用两个普通栈实现一个特殊栈,使得pop、push、min三个函数的都是复杂度为O(1)的操作,min函数是获得当前栈的最小值。

初步想法

1.要实现min函数为(1)操作,当时第一想法是事先需要算好当前最小值,于是会想到用一个值来保存当前栈中最小值元素,然后push和pop操作的时候维护这个值。这样min,push都是O(1)了,但pop可不是,如果当前弹出的是最小值,需要从新寻找当前元素的最小值,这个就不是o(1)了。

2.而且上面方法没有用到另外一个栈,于是又想到:在一个栈中存储排好序的元素,同样在push和pop操作中维护这个有序堆栈,如图:

用PHP解决的一个栈的面试题

但是这样的话min操作是O(1),但是push、pop操作因为要维护这个有序栈,怎么也想不到一个方法可以O(1)的复杂度。

当时觉得肯定是在另一个栈中缓存最小值信息,但是不知道是因为没吃饭还是怎么地,思维就此僵住了。

正确解法

遇到问题解决不了,感觉心里很不爽,于是吃饭的时候又开始想怎么充分理由栈的特性,有效的缓存最小值信息,以便min操作使用。

栈操作最大的特性是只能操作栈顶元素,想到那用一个辅助栈缓存每次栈操作时的最小值,不是刚刚好。这样每次pop操作的时候,两边一起弹出就可以;因为辅助栈的栈顶元素最当前栈中的最小值,push操作是也只需要比较入栈元素和辅助栈栈顶元素就可以。这样push、pop、min都都O(1)操作了。如图:

用PHP解决的一个栈的面试题

文字可能没说清楚,上代码,下面是PHP的实现,通过数组来模拟堆栈。

<?php
/**
 * 使用一个辅助栈,O(1)复杂度求出栈中的最小数
 * @hack 类中通过数组来模拟堆栈
 * 
 * @author laiwenhui
 */
class strack{

  /**
   * 数据栈,存储栈数据;
   *
   * @var array
   */
  private $_arrData = array();
  /**
   * 辅助栈,存储数据组栈中每层的最下值信息;
   *
   * @var array
   */
  private $_arrMin = array();
  /**
   * 栈顶所在单元
   *
   * @var int
   */
  private $_top=-1;
  /**
   * 出栈
   * @return bool|int
   */
  public function pop(){
    if ($this->_top === -1){
      return false;
    }
    array_pop($this->_arrMin);
    $this->_top--;
    return array_pop($this->_arrData);
  }
  /**
   * 入栈
   * @param int $element
   * @return bool
   */
  public function push($element){
    $element = intval($element);
    //如果栈为空,直接入栈
    if ($this->_top === -1){
      array_push($this->_arrData, $element);
      array_push($this->_arrMin, $element);
      $this->_top++;
      return true;
    }
    //不为空,判断入栈的值是否比最小栈栈顶小
    $min = $this->_arrMin[$this->_top];
    //比较求出最小值
    $currentMin = $element < $min ? $element : $min;
    //当前栈中最小值入栈
    array_push($this->_arrMin, $currentMin);
    //数据入栈
    array_push($this->_arrData, $element);
    $this->_top++;

    return true;
  }
  /**
   * 求当前栈空间的最小值
   * @return bool|int 
   */
  public function min(){
    if ($this->_top === -1){
      return false;
    }
    return $this->_arrMin[$this->_top];
  }
}

使用如下:

$obj = new strack();

$obj->push(12);

$obj->push(56);

$obj->push(23);

$obj->push(89);

$obj->push(4);

var_dump($obj->min());

$obj->pop();

var_dump($obj->min());

$obj->push(8);

var_dump($obj->min());

输出为:

int(4)

int(12)

int(8)

OK,满足要求。

你是否有其他更好方法实现,如果有,请告诉我^_^

PHP 相关文章推荐
PHP 导出数据到淘宝助手CSV的方法分享
Feb 27 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
Jun 24 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
解析php中获取url与物理路径的总结
Jun 21 PHP
php实现加减法验证码代码
Feb 14 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
Oct 15 PHP
Thinkphp调用Image类生成缩略图的方法
Mar 07 PHP
PHP中生成UUID自定义函数分享
Jun 10 PHP
PHP简单实现DES加密解密的方法
Jul 12 PHP
PHP中字符与字节的区别及字符串与字节转换示例
Oct 15 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
Jun 08 PHP
ThinkPHP5.1框架数据库链接和增删改查操作示例
Aug 03 PHP
函数中使用require_once问题深入探讨 优雅的配置文件定义方法推荐
Jul 02 #PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 #PHP
php foreach正序倒序输出示例代码
Jul 01 #PHP
浅析ThinkPHP的模板输出功能
Jul 01 #PHP
ThinkPHP中的系统常量和预定义常量集合
Jul 01 #PHP
ThinkPHP实现多数据库连接的解决方法
Jul 01 #PHP
ThinkPHP快速入门实例教程之数据分页
Jul 01 #PHP
You might like
php中fgetcsv()函数用法实例
2014/11/28 PHP
php+mysql结合Ajax实现点赞功能完整实例
2015/01/30 PHP
PHP自定义函数实现格式化秒的方法
2016/09/14 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
csdn 批量接受好友邀请
2009/02/19 Javascript
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
angularjs 处理多个异步请求方法汇总
2015/01/06 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
JavaScript实现Flash炫光波动特效
2015/05/14 Javascript
基于JavaScript实现抽奖系统
2018/01/16 Javascript
JS基于Location实现访问Url、重定向及刷新页面的方法分析
2018/12/03 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
Python编程之属性和方法实例详解
2015/05/19 Python
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
Python实现word2Vec model过程解析
2019/12/16 Python
python读取Kafka实例
2019/12/23 Python
Python 读取位于包中的数据文件
2020/08/07 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
PHP引擎php.ini参数优化深入讲解
2021/03/24 PHP
物业管理毕业生个人的求职信
2013/11/30 职场文书
新闻编辑求职信
2014/04/09 职场文书
高中竞选班长演讲稿
2014/04/24 职场文书
工程承包协议书
2014/10/20 职场文书
考试作弊检讨书
2014/10/21 职场文书
地雷战观后感
2015/06/09 职场文书
秋收起义观后感
2015/06/11 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle
Mysql 一主多从的部署
2022/05/20 MySQL
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS
MySQL数据库查询之多表查询总结
2022/08/05 MySQL