数据结构之队列的链式存储(Java表示)
程序员文章站
2022-06-03 18:31:51
...
队列的链式存储
队列的链式存储实现
队列指针front和rear也不能放在链表尾部(即队列的头front必须指向链表的头结点,队列的尾必须指向链表的尾结点),因为放在尾部删除元素后不清楚前一个元素的位置了。
采用链式存储的入队和出队操作实际就是在一个链表的尾部插入结点或在头部删除结点。
Java代码实现
/**
* 队列的链式存储
*
* @author lck100
*/
public class MyQueue {
private Node front;// 指向队列头元素的引用
private Node rear;// 指向队列尾元素的引用
private MyQueue() {
front = null;
rear = null;
}
/**
* 判断队列是否为空
*
* @return 如果队列为空返回true,否则返回false
*/
public boolean isEmpty() {
// 指向队头元素的引用为空即队列为空
return front == null;
}
/**
* 入队
*
* @param item 要在队尾插入的元素
*/
public void addQueue(Object item) {
// 创建一个要插入的新结点
Node newNode = new Node();
newNode.setData(item);
newNode.setNext(null);
// 考虑队列为空的情况
if (isEmpty()) {
// 将队头和队尾都指向新添加的结点
front = newNode;
rear = front;
} else {
// 队列有元素的情况下
rear.setNext(newNode);
rear = newNode;
}
}
public Object deleteQueue() throws Exception {
if (isEmpty()) {
throw new Exception("队列为空!");
} else {
// 要删除的就是头结点所在的元素
Node delNode = front;
// 如果队列只有一个元素
if (front == rear) {
// 删除后队列置为空
front = rear = null;
} else {
// 将队列头元素结点指向元队列头的下一个结点
front = front.getNext();
}
// 返回要删除结点的数据
return delNode.getData();
}
}
public static void main(String[] args) throws Exception {
MyQueue queue = new MyQueue();
// 判断队列是否为空
System.out.println(queue.isEmpty());
// 入队
queue.addQueue("唐僧");
queue.addQueue("孙悟空");
queue.addQueue("猪八戒");
// 出队
System.out.println(queue.deleteQueue());
System.out.println(queue.deleteQueue());
System.out.println(queue.deleteQueue());
}
}
测试,控制台打印: