Java语言怎么编写环形队列的插入和删除的演示代码?环形队列一定要用链表实现的么?还是可以使用循环链表
(循环)链表、数组都行,数组的话使用取模的方式获得下标。找了个简单实现,供参考:https://blog.csdn.net/qq_38186465/article/details/123676814
都可以的,给你个例子:
public class CircularQueue {
private int[] queue;
private int front;
private int rear;
private int size;
private int count;
public CircularQueue(int size) {
this.size = size;
queue = new int[size];
front = 0;
rear = -1;
count = 0;
}
public boolean isEmpty() {
return count == 0;
}
public boolean isFull() {
return count == size;
}
public void enqueue(int item) {
if (isFull()) {
System.out.println("Queue is full. Cannot enqueue " + item);
return;
}
rear = (rear + 1) % size;
queue[rear] = item;
count++;
System.out.println("Enqueued " + item);
}
public int dequeue() {
if (isEmpty()) {
System.out.println("Queue is empty. Cannot dequeue.");
return -1;
}
int item = queue[front];
front = (front + 1) % size;
count--;
System.out.println("Dequeued " + item);
return item;
}
public int peek() {
if (isEmpty()) {
System.out.println("Queue is empty. No peek.");
return -1;
}
return queue[front];
}
public static void main(String[] args) {
CircularQueue queue = new CircularQueue(5);
queue.enqueue(10);
queue.enqueue(20);
queue.enqueue(30);
queue.enqueue(40);
queue.enqueue(50);
queue.enqueue(60); // Will display queue full message, as the size is exceeded
System.out.println("Front: " + queue.peek());
queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue();
queue.dequeue(); // Will display queue empty message, as elements are dequeued
System.out.println("Is queue empty? " + queue.isEmpty());
System.out.println("Is queue full? " + queue.isFull());
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话:如图:
前者适合稠密图,后者适合稀疏图。
这里介绍用邻接矩阵实现:
在图中,一条边得由两个顶点决定。因此,要表示一条边,得注明两边的顶点是哪些;
所以我们用二维数组来存储边,二维数组的行数和列数都是顶点的个数,二维数组中的值代表该行(某顶点)该列(某顶点)下的边的情况。
这里,我用0代表两顶点间无边,大于0的树值代表边的权值。
使用链表来实现环形队列的插入和删除操作是一种常见的做法。可以通过循环链表来代替普通的链表,因为循环链表的尾结点指向头结点,形成一个闭环,可以方便地实现环形队列的插入和删除操作。
下面是用Java语言实现环形队列的插入和删除操作的代码示例:
public class CircularQueue {
private Node head; // 头结点
private Node tail; // 尾结点
// 定义链表节点
private class Node {
int value;
Node next;
public Node(int value) {
this.value = value;
this.next = null;
}
}
// 初始化环形队列
public CircularQueue() {
head = null;
tail = null;
}
// 插入元素到队列尾部
public void enqueue(int value) {
Node newNode = new Node(value);
if (head == null) {
head = newNode;
} else {
tail.next = newNode;
}
tail = newNode;
tail.next = head; // 将尾结点指向头结点,形成闭环
}
// 删除队列头部的元素
public void dequeue() {
if (head == null) {
System.out.println("Queue is empty!");
return;
}
if (head == tail) {
head = null;
tail = null;
} else {
head = head.next;
tail.next = head; // 更新尾结点的指向
}
}
}
使用示例:
CircularQueue queue = new CircularQueue();
// 插入元素到队列尾部
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
// 删除队列头部的元素
queue.dequeue();
// 输出队列中的元素
Node node = queue.head;
while (node != null) {
System.out.println(node.value);
node = node.next;
}
以上代码通过循环链表来实现环形队列的插入和删除操作,使得队列的输出和输入可以从前后端分别处理。其中,front变量记录队列前端的下标,rear变量记录队列后端的下标,可以实现插入和删除操作的环形移动。
需要注意的是,以上代码仅为示例,具体的实现需要根据具体需求和场景进行适当修改。