作为程序员一定要保持良好的睡眠,才能好编程

PHP实现栈与队列的代码实例

发布时间:2020-05-17

:后进先出、先进后出


队列:先进先出,后进后出


下面我们使用PHP来实现一下:


class Stack{
	private $_list;
	public function __construct(){

		$this->_list=[];
	}

	public function append($item){
		array_push($this->_list,$item);

		return sizeof($this->_list);
	}

	public function pop(){
		return array_pop($this->_list);
	}
	

	public function list(){
		return $this->_list;
	}

	public function is_empty(){
		return empty($this->_list)?true:false;	
	}

	public function length(){
		return sizeof($this->_list);
	}

}


$stack=new Stack();

$stack->append(12);
$stack->append(13);
$stack->append(14);
$stack->append(15);


print_r($stack->list());

print_r($stack->append(19));

print_r($stack->list());
var_dump($stack->is_empty());
var_dump($stack->length());

var_dump($stack->pop());
var_dump($stack->pop());
var_dump($stack->pop());
var_dump($stack->pop());



队列


<?php


class Queue{
	private $_list;
	public function __construct(){

		$this->_list=[];
	}


	public function append($item){
		array_push($this->_list,$item);

		return sizeof($this->_list);
	}

	public function pop(){
		//return array_shift($this->_list);
		return array_splice($this->_list,0,1);
	}

	/**
	 * 在哪里插入一个数据
	 * [insert description]
	 * @param  [type] $index index 位置 
	 * @param  [type] $item  插入的元素 
	 * @return [type]        [description]
	 */
	public function insert($index,$item){
		array_splice($this->_list,$index,0,$item);
	}

	public function list(){
		return $this->_list;
	}

	public function is_empty(){
		return empty($this->_list)?true:false;	
	}

	public function length(){
		return sizeof($this->_list);
	}

}


$stack=new Queue();

$stack->append(12);
$stack->append(13);
$stack->append(14);
$stack->append(15);


print_r($stack->list());


print_r($stack->insert(1,19));

print_r($stack->list());


exit;

var_dump($stack->length());

var_dump($stack->pop());

print_r($stack->list());

var_dump($stack->pop());

print_r($stack->list());


var_dump($stack->pop());

print_r($stack->list());


 

 

 
var_dump($stack->is_empty());
var_dump($stack->length());


var_dump($stack->pop());
var_dump($stack->pop());
var_dump($stack->pop());


队列中核心方法:


list() 返回列表中元素的个数

append($item) 添加一个元素

pop() 抛出一个元素

insert($index,$item) 在指定位置添加一个元素

is_empty() 判断元素是否为空

length()  返回列表中元素的个数



核心道理:由于项目是php的,就使用php中提供的数组去实现。


队列:先进先出,后进后出,意思:一头进,另一头出。 array_push() , array_shift() 

栈:后进先出,意思:从一头进一头出,犹如接水,后来流进来的水,先被喝到。

array_push() 进  array_pop() 这样就实现了栈。




说:为什么当数组很大的时候,array_pop 很快  array_shift 很慢? 这是时间复杂度的影响。


对,就是array_shift操作后,数组的键值变了。这就是array_shift为什么慢的原因了。因为array_shift操作数组会对数字键值,重新从0开始重建。

每次移出一个元素后,就得遍历数组中的所有元素。array_pop就不会了。一个是O(1),一个是O(n)的复杂度,数组大了之后,效果就很明显了。