行列又是一种比较特别的线性表,和栈相同在线性表的基础上进行了一些约束操作。便是行列了。望文生义,行列便是我们排队买火车票相同,排在最前面的先买到,排到后边的后买到。先进先出、后进后出。
行列的操作
行列的操作一般包含:进行列、出行列,拜访行列头元素、删去行列头元素、判别行列是否为空、取得行列巨细这些中心操作。
行列的次序完成
和栈结构相同行列也有两种完成方法相对于次序完成方法,链式完成相对比较简单,只需要使用Node结构,记载下行列的头Node和尾巴Node,在记载下元素个数就可以了。完成代码如下:
package dateStructer.queue;
public class MyQueue implements Queue {
/**
* 双向链表结构
*/
public class LinkNode {
// 真实的数据域
private E date;
// 记载上一个节点
private LinkNode prevLinkNode;
// 记载下一个节点
private LinkNode nextLinkNode;
public LinkNode() {
}
public LinkNode(E date, LinkNode prevLinkNode, LinkNode nextLinkNode) {
this.date = date;
this.prevLinkNode = prevLinkNode;
this.nextLinkNode = nextLinkNode;
}
}
// 结点个数
private int nodeSize;
// 头结点
private LinkNode headNode;
// 尾巴节点
private LinkNode tailNode;
public MyQueue(){
headNode = null;
tailNode = null;
}
/**
* 增加元素
*/
@Override
public boolean add(E element) {
if (nodeSize == 0) {
headNode = new LinkNode(element, null, tailNode);
}else {
if (tailNode == null) {
tailNode = new LinkNode(element, headNode, null);
headNode.nextLinkNode = tailNode;
nodeSize++;
return true;
}
LinkNode linkNode = tailNode;
tailNode = new LinkNode(element, linkNode, null);
linkNode.nextLinkNode = tailNode;
}
nodeSize++;
return true;
}
/**
* 拜访行列头元素
*/
@Override
public E element() {
return headNode.date;
}
/**
* 返回头元素,不删去头元素
*/
@Override
public E peek() {
return headNode.date;
}
/**
* 返回头元素,删去头元素
*/
@Override
public E poll() {
LinkNode headNodeTemp = headNode;
E date = headNodeTemp.date;
if(headNode.nextLinkNode == null){
headNode.date = null;
headNode = null;
nodeSize–;
return date;
}else{
headNode = headNode.nextLinkNode;
if(headNode == tailNode){
tailNode = null;
}
}
nodeSize–;
return headNodeTemp.date;
}
/**
* 铲除一切元素
*/
@Override
public void clear() {
LinkNode linkNodeNowTemp = headNode;
for (int i = 0; i < nodeSize; i++) {
if (linkNodeNowTemp != tailNode && linkNodeNowTemp != headNode) {
linkNodeNowTemp = linkNodeNowTemp.nextLinkNode;
linkNodeNowTemp.prevLinkNode.nextLinkNode = null;
linkNodeNowTemp.prevLinkNode.prevLinkNode = null;
linkNodeNowTemp.prevLinkNode.date = null;
linkNodeNowTemp.prevLinkNode = null;
} else if (linkNodeNowTemp == tailNode) {
linkNodeNowTemp.prevLinkNode = null;
} else if (linkNodeNowTemp == headNode) {
linkNodeNowTemp.nextLinkNode = null;
}
}
headNode = null;
tailNode = null;
nodeSize = 0;
}