目录
一:队列的介绍
先进后出(一般为循环队列,否则空间资源浪费)
二:队列的操作
需要两个指针
2.1 问题:存在队列溢出的问题
真溢出
假溢出(队列中存在空间没有办法重复利用)
2.2 问题解决
(rear)% 数组长度 == 1表示队列溢出(rear代表下标)
三:静态循环队列的代码展示
3.1 增加元素
//增加
public void add(int num) {
if(isFull()) {
System.out.println("队列已满,已更新队列");
return;
}
if(fountPoint == -1 && tailPoint == -1) {
fountPoint = 0;
tailPoint = 0;
}
array[tailPoint] = num;
tailPoint = (tailPoint + 1) % maxSize;
}
3.2 删除元素
需要一个辅助的指针,每删除完一次就需要归一次位
public int deleteLook() {
if(isEmpty()) {
throw new RuntimeException("队列为空");
}
int helper = 1;
int temp = array[fountPoint];
//删除并更新
while(true) {
if(helper == tailPoint) {
array[tailPoint] = 0;
helper = 1;
break;
}
if(helper < tailPoint) {
array[helper - 1] = array[helper];
helper++;
}
}
tailPoint--;
return temp;
}
3.3 查看元素
public void query() {
if(fountPoint == -1 && tailPoint == -1 || isEmpty()) {
System.out.println("该队列为空");
return;
}
for(int i = 0; i < tailPoint; i++) {
System.out.print(array[i]);
}
}
四:动态循环队列的代码展示
3.1 增加元素
//构建循环队列
public void addQuery(int num) {
this.num = num;
if(num < 0) {
System.out.printf("数据不正确");
}
if(rear.getNext() == first) {
System.out.println("队列已满");
}
for(int i = 1; i <= num; i++) {
System.out.println("请输入元素:");
int no = sc.nextInt();
QueryNode node = new QueryNode(no);
if(i == 1) {
first = node;
first.setNext(rear);
}
rear.setNext(node);
rear = node;
if(i == num) {
rear.setNext(first);
}
}
}
3.2 删除元素
//删除队列元素
public int delete() {
QueryNode temp = first;
first = first.getNext();
int i = temp.getNo();
temp.setNo(0);
return i;
}
3.3 查看元素
//查看循环队列
public void look() {
QueryNode temp = first;
for(int i = 0; i < num; i++) {
System.out.printf("结点编号:%d", temp.getNo());
temp = temp.getNext();
System.out.println();
}
}