队列和栈可以用双向循环链表实现:不需要指定头尾指针,减少了出错的概率
重点:nil节点的pre为队尾,next为队头。
队的实现:从队尾插入,队头取出。先入先出
class Queue{
Node nil;
public Queue(){
//nil节点初始化,pre,next都指向nil自己
nil = new Node();
nil.pre = nil;
nil.next = nil;
}
void enQueue(Node node){
node.pre = nil.pre;
node.next = nil;
nil.pre.next = node;
nil.pre = node;
}
Node deQueue(){
if(isEmpty()) return null;
Node curr = nil.next;
curr.next.pre = curr.pre;
curr.pre.next = curr.next;
curr.pre = nil;
curr.next = nil;
return curr;
}
boolean isEmpty(){
return nil.next==nil?true:false;
}
}
class Node{
Node pre,next;
Object data;
}
栈的实现:从队尾插入,队尾取出。后入先出
class Stack{
Node nil;
public Stack(){
Node nil = new Node();
nil.rep = nil;
nil.next = nil;
}
void push(Node node){
node.pre = nil.pre;
node.next = nil;
nil.pre.next = node;
nil.pre = node;
Node pop(){
if(isEmpty()) return null;
Node curr = nil.pre;
curr.pre.next = curr.next;
curr.next.pre = curr.pre;
curr.pre = nil;
curr.next = nil;
return curr;
}
boolean isEmpty(){
return nil.next==nil?true:false;
}
}
class Node{
Node pre,next;
Object data;
}