背景知识:
- 栈的特点就是先进后出,队列的特点就是先进先出。栈的一个重要应用场景就是倒序某一个东西,例如字符串等等。
1.使用数组结构实现固定长度的栈:思路比较简单,可以在内部维护一个索引值,通过这个索引值与长度的关系来保证栈结构的长度固定。
<?php
//栈类
class Stack {
//栈的长度
private $length;
//数组结构,用来保存栈的数据
private $array;
//内部维护的索引
private $index;
//初始化
public function __construct($length)
{
$this->length=$length;
$this->array=[];
$this->index=0;
}
//压入栈的操作
public function push($value){
if($this->index>=$this->length){
return 'the stack is full~';
}
$this->array[$this->index++]=$value;
}
//弹出栈的操作
public function pop(){
if($this->index<=0){
return 'the stack is empty~';
}
return $this->array[--$this->index];
}
//获取栈顶元素
public function poll(){
if($this->index<=0){
return 'the stack is empty~';
}
$index=$this->index-1;
return $this->array[$index];
}
public function isEmpty(){
return 0==$this->index;
}
}
2.使用数组结构实现固定长度的队列:思路:准备两个索引start和end,当入队时end移动,当出队时start移动,再准备一个size变量用来保存队列的当前长度。(注意:end和start的值是不断从0--length-1变化的)
<?php
class Queue{
private $length;
private $start;
private $end;
private $size;
private $array;
public function __construct($length)
{
$this->length=$length;
$this->start=0;
$this->end=0;
$this->size=0;
$this->array=[];
}
//入队
public function push($value){
if($this->size>=$this->length){
return 'the queue is full~';
}
$this->size++;
$this->array[$this->end]=$value;
//如果end大于等于最大索引值之后重新置为0
$this->end=$this->end>=$this->length-1?0:$this->end+1;
}
//出队
public function pop(){
if($this->size<=0){
return 'the queue is empty~';
}
$this->size--;
$result=$this->array[$this->start];
//如果start大于等于最大索引值之后重新置为0
$this->start=$this->start>=$this->length-1?0:$this->start+1;
return $result;
}
}
$queue=new Queue(10);
$queue->push(12);
$queue->push(14);
var_dump($queue->pop());
var_dump($queue->pop());