接口
队列的接口和栈的接口是类似的
-
enqueue();
-
dequeue();
-
isEmpty();
链表方式实现
队列需要两个指针,记录头和尾。出队时与栈是一样的,入队的时候在结尾增加一个节点。
代码
public
class
LinkedQueue<T>
{
private
class
Node
{
public
T
value;
public
Node
next;
}
private
Node
first;
private
Node
last;
public
LinkedQueue(){
}
public
void
enqueue(T
value){
Node
node =
new
Node();
node.value
= value;
node.next
=
null
;
if
(isEmpty()){
//
处理队列为空的特殊情况
first
= node;
//
注意第一个节点
last
= node;
}
else
{
last.next
= node;
last
= node;
}
}
public
T
dequeue(){
T
result = first.value;
first
= first.next;
if
(isEmpty()){
//
处理队列为空的特殊情况
last
=
null
;
}
return
result;
}
public
boolean
isEmpty(){
return
first
==
null
;
}
}
数组方式实现
队列也可以使用数组方式实现,当数组的使用率小于25%时,就重新调整数组的大小
代码
public
class
ArrayQueue<T>
{
private
Object[]
s;
private
int
head;
private
int
tail;
public
ArrayQueue(){
s
=
new
Object[
2
];
}
public
void
enqueue(T
item){
//
如果数组已满,调整数组
if
(s.length
== tail){
resize(s.length*
2
);
}
//
添加到数组的末尾
s[tail]
= item;
tail++;
}
public
T
dequeue() {
//
返回的结果应该是队列的头部
Object
result = s[head];
head++;
//
如果队列使用率不到1/4,则调整数组大小
int
size
=
this
.size();
if
(size
>=
2
&&
size < s.length/
4
){
resize(s.length/
2
);
}
//
返回结果
return
(T)result;
}
private
void
resize(
int
size){
//复制一份新的数组
Object[]
copy =
new
Object[size];
int
queueSize
=
this
.size();
for
(
int
i=
0
;i<queueSize;i++){
copy[i]
= s[i+head];
}
s
= copy;
//
重置指针
head=
0
;
tail=queueSize;
}
//
队列长度
private
int
size()
{
return
tail-head;
}
}