zoukankan      html  css  js  c++  java
  • 算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈

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

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

    要求:

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

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

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

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

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

    代码:

     1 <?php
     2 
     3 class MyStack1 {
     4     
     5     //普通栈
     6     private $stackData = array();
     7     //保存每一步最小值的栈
     8     private $stackMin = array();
     9     
    10     //向栈中压入数据
    11     public function push($newNum) {
    12          //向保存最小值的栈中压入数据
    13          if(empty($this->stackMin)) {
    14             array_push($this->stackMin, $newNum);
    15          }else if($newNum <= $this->getMin()) {
    16             array_push($this->stackMin, $newNum);
    17          }
    18          //向普通栈中压入数据
    19          array_push($this->stackData, $newNum);
    20     }
    21 
    22     //弹出栈顶元素
    23     public function pop(){
    24 
    25         try {
    26             if(empty($this->stackData)) {
    27                 throw new Exception('Your stack is empty.');
    28             }else{
    29                 //普通栈出栈
    30                 while(!empty($this->stackData)) {
    31                     $val = array_pop($this->stackData);
    32                     if($val == $this->getMin()) {
    33                         $value = $val;
    34                     }
    35                 }
    36                 return $value;            
    37             }    
    38         }catch(Exception $e) {
    39             echo $e->getMessage();
    40         }
    41     }
    42 
    43     //返回栈中的最小元素
    44     public function getMin() {
    45 
    46         try {
    47             if(empty($this->stackMin)) {
    48                 throw new Exception('Your stack is empty.');
    49             }else{
    50                 //返回栈顶元素
    51                 $count = count($this->stackMin);
    52                 return $this->stackMin[$count - 1];            
    53             }    
    54         }catch(Exception $e) {
    55             echo $e->getMessage();
    56         }
    57     }
    58 
    59     //查看普通栈
    60     public function getStackData() {
    61         return $this->stackData;
    62     }
    63 
    64     //查看保存最小值的栈
    65     public function getStackMin() {
    66         return $this->stackMin;
    67     }
    68 } 

    实例化并查看最小值:

    $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
  • 相关阅读:
    随堂练习
    随堂练习
    第六次安卓作业
    第五次安卓
    第四次安卓
    第二次安卓
    安卓作业
    第十八次上机
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/dee0912/p/4902577.html
Copyright © 2011-2022 走看看