用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对字符串的递增运算分析
Aug 08 PHP
基于php-fpm 参数的深入理解
Jun 03 PHP
php输入流php://input使用示例(php发送图片流到服务器)
Dec 25 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
Jan 24 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
PHP的swoole扩展安装方法详细教程
May 18 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
Sep 17 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
Feb 19 PHP
PHP实现的服务器一致性hash分布算法示例
Aug 09 PHP
php实现微信小程序授权登录功能(实现流程)
Nov 13 PHP
PHP Web表单生成器案例分析
Jun 02 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
Youku 视频绝对地址获取的方法详解
2013/06/26 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
php动态添加url查询参数的方法
2015/04/14 PHP
IOS 开发之NSDictionary转换成JSON字符串
2017/08/14 PHP
PHP 模拟登陆功能实例详解
2019/09/10 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
Javascript常用字符串判断函数代码分享
2014/12/08 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript中if和switch,==和===详解
2015/07/30 Javascript
JavaScript优化专题之Loading and Execution加载和运行
2016/01/20 Javascript
jQuery layui常用方法介绍
2016/07/25 Javascript
AngularJS 入门教程之HTML DOM实例详解
2016/07/28 Javascript
总结JavaScript的正则与其他语言的不同之处
2016/08/25 Javascript
快速掌握jQuery插件WebUploader文件上传
2016/11/07 Javascript
使用bat打开多个cmd窗口执行gulp、node
2017/02/17 Javascript
JavaScript实现开关等效果
2017/09/08 Javascript
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
Vuejs 实现简易 todoList 功能 与 组件实例代码
2018/09/10 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
python解析json实例方法
2013/11/19 Python
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
django 微信网页授权登陆的实现
2019/07/30 Python
python实现PID算法及测试的例子
2019/08/08 Python
Django获取应用下的所有models的例子
2019/08/30 Python
森林病虫害防治方案
2014/06/02 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
客户付款通知书
2015/04/23 职场文书
2016年共产党员个人承诺书
2016/03/24 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS