算法与数据结构题目的 PHP 实现:栈和队列 设计一个有 getMin 功能的栈
2015-10-22 21:10
981 查看
刚入手了一本《程序员代码面试指南》,书中题目的代码都是 Java 实现的,琢磨着把这些代码用 PHP 敲一遍,加深印象。
题目:设计一个有 getMin 功能的栈 —— 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
要求:
① pop、push、getMin 操作的时间复杂度都是 O(1)
② 设计的栈类型可以使用现成的栈结构
PHP 当中没有栈和队列的概念(5.3 以后增加了 SplStack 类),但是可以用数组来模拟栈和队列,用到的方法有 array_push 和 array_pop
array_push:向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度
array_pop:array_pop() 函数删除并返回数组中的最后一个元素
代码:
实例化并查看最小值:
输出:
题目:设计一个有 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
相关文章推荐
- 数据结构之红黑树
- Java数据结构
- 数据结构
- 数据结构之旅(一)一些基本的概念
- 数据结构:加权图的API
- 二叉查找树
- 队列的顺序表示和实现
- 数据结构与算法--字符串
- 6.数据结构之通用栈(链表实现)
- 程序员书单_数据结构和算法篇
- Trie树进阶:Double-Array Trie原理及状态转移过程详解
- 数据结构之二叉树链表
- 2015年大二上-数据结构-顺序表(2)-奇右偶左
- 2015年大二上-数据结构-顺序表(2)-删除元素
- 2015年大二上-数据结构-顺序表(1)-求集合并集
- STL基本使用方法总结
- R语言的数据结构
- 5.数据结构之通用动态数组
- c 数据结构
- 数据结构之Vector