算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
刚入手了一本《程序员代码面试指南》,书中题目的代码都是 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 功能的栈的更多相关文章
- 栈和队列----设计一个有getMin功能的栈
		设计一个有getMin功能的栈 设计一个具有getMin功能的栈,可以返回栈中的最小的元素,可以使用现有的栈的数据结构,要求pop/push/getMin操作的时间复杂度是O(1). package ... 
- 《程序员代码面试指南》第一章 栈和队列 设计一个有getMin功能的栈
		题目 实现一个特殊的栈,在实现栈的基本功能上,再实现返回栈中最小的元素的操作 要求 1. pop.push.getMin操作时间复杂度都是O(1) 2. 设计的栈类型可以使用现成的栈结构 java代码 ... 
- 设计一个有getMin功能的栈
		[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“设计一个有getMin功能的栈”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明 ... 
- 常见面试算法题JS实现-设计一个有getMin功能的栈
		前言: 已经确定工作了-下周一正式入职,按理说应该是可以好好浪荡一周的,但是内心总是不安,总觉得自己这个水平真的太菜了,还是趁着现在有自己的时间,赶紧多看看书,多学习学习吧orz所以把之前校招买的书, ... 
- 栈和队列问题:设计一个有 getMin 功能的栈
		[知识点] 栈是一个先进后出(FILO-First In Last Out)的数据结构,队列是一种先进先出(FIFO-First In First Out)的数据结构. [题目] 实现一个特殊的栈,在 ... 
- 设计一个有getMin功能的栈(1)
		题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ... 
- 设计一个带有getmin功能的栈,保证时间复杂度在O(1)
		2017-06-22 20:56:10 需要得到最小值,最简单的思路就是遍历一遍求出最小值.但是这样的时间复杂度会是O(n),不满足O(1)的要求.于是想到在建立一个栈来保存最小值. 具体操作是建立 ... 
- 设计一个有getMin功能的栈(2)
		题目: 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 要求: 1.pop.push.getMin操作的时间复杂度都是O(1) 2.设计的栈类型可以输用现成的栈结构 解答 ... 
- stack_1.设计一个有getMin功能的栈
		思路 : 生成两个栈($stack ,$stack_min ),往$stack塞数据($value)的时候 ,比较一下$value和$stack_min最上面的元素的大小,如果$value小,则压入$ ... 
随机推荐
- Hibernate核心思想—ORM机制(一)
			转:http://blog.csdn.net/wanghuan203/article/details/7566518 hibernate是一个采用ORM(Object/Relation Mapping ... 
- [译]SQL Server 之 查询优化器
			因为生成查询计划的代价比较大,所以查询计划将会被缓存. 树形结构 SQL 查询首先被转化为树形结构,每个节点都是一个查询操作.例如: SELECT * FROM Customers C INNER J ... 
- C#学习笔记(七)——定义类
			一.C#中类的定义 1.类的定义 class Myclass { } 默认情况下是类是内部的,即外部的项目是不可以访问这个类,相当于加internal来修饰.但实际上是不需要加入的. 如果要指定类是公 ... 
- AsyncTask的基础讲解
			@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); s ... 
- BZOJ3640 : JC的小苹果
			设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量. 对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac ... 
- BZOJ3790 : 神奇项链
			Manacher求出所有极长回文子串后,得到一堆线段,转化成线段覆盖问题 预处理出g[i]表示左端点不超过i的右端点的最大值 贪心地线段覆盖即可 时间复杂度$O(n)$ #include<cst ... 
- Guaranteeing message processing —— 可靠的消息处理
			Storm's reliability API: how Storm guarantees that every message coming off a spout will be fully pr ... 
- 分布式流式处理框架:storm简介 + Storm术语解释
			简介: Storm是一个免费开源.分布式.高容错的实时计算系统.它与其他大数据解决方案的不同之处在于它的处理方式.Hadoop 在本质上是一个批处理系统,数据被引入 Hadoop 文件系统 (HDFS ... 
- 各新旧版本Java及其相关文档可以从这里下载
			http://www.oracle.com/technetwork/java/archive-139210.html 
- UOJ#77. A+B Problem
			题目名称是吸引你点进来的. 从前有个 n 个方格排成一行,从左至右依此编号为 1,2,⋯,n. 有一天思考熊想给这 n 个方格染上黑白两色. 第 i 个方格上有 6 个属性:ai,bi,wi,li,r ... 
