-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDesignCircularQueue.php
100 lines (75 loc) · 2.64 KB
/
DesignCircularQueue.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<?php
namespace QueueAndStack\QueueFirstInFirstOut\DesignCircularQueue;
// 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
//
// 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
//
// 你的实现应该支持如下操作:
//
// MyCircularQueue(k): 构造器,设置队列长度为 k 。
// Front: 从队首获取元素。如果队列为空,返回 -1 。
// Rear: 获取队尾元素。如果队列为空,返回 -1 。
// enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
// deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
// isEmpty(): 检查循环队列是否为空。
// isFull(): 检查循环队列是否已满。
class MyCircularQueue
{
protected $data;
protected $originSize = 0;
protected $size;
// 当值进入, back 即可变为 0,使两个指向同一个元素
protected $back = -1;
protected $front = 0;
public function __construct($k)
{
$this->data = array_fill(0, $k, null);
$this->size = $k;
}
public function enQueue($value)
{
// 队列是否已经装满
if ($this->isFull()) {
return false;
}
++$this->originSize;
// 判断队列是否超越了边界
// 先移动再操作数组坐标
$this->back = ($this->back == $this->size-1) ? 0 : $this->back+1;
$this->data[$this->back] = $value;
return true;
}
public function deQueue()
{
if ($this->isEmpty()) {
return false;
}
--$this->originSize;
// 先操作坐标值,再移动
$this->data[$this->front] = null;
$this->front = ($this->front == $this->size-1) ? 0 : $this->front+1;
return true;
}
public function Front()
{
if ($this->isEmpty()) {
return -1;
}
return $this->data[$this->front];
}
public function Rear()
{
if ($this->isEmpty()) {
return -1;
}
return $this->data[$this->back];
}
public function isEmpty()
{
return 0 === $this->originSize;
}
public function isFull()
{
return $this->size === $this->originSize;
}
}