数组模拟队列出现的问题
数组使用一次就不能再用了,没有达到复用的效果
思路分析
- front变量指向队列的第一个元素,就是number[front]是队列的第一元素,front的初始值为0
- rear变量的指向队列的最后一个元素的后一位,rear的初始值也为0
- 当队列满时,条件是(rear + 1) % maxSize == front【满了的条件】
- 当队列为空时,条件是rear == front【空的条件】
- 队列中有效的数据个数为:(rear + maxSize -front) % maxSize
import java.util.Scanner;
class test1{
public static void main(String[] args) {
Queue2 queue2 = new Queue2(4);
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while(loop){
System.out.println("s(show)");
System.out.println("e(exit)");
System.out.println("a(add)");
System.out.println("g(get)");
System.out.println("h(head)");
key = scanner.next().charAt(0);
switch (key){
case 's':queue2.showQueue();break;
case 'a':
int value = scanner.nextInt();
queue2.addQueue(value);break;
case 'g':
try {
System.out.printf("%d\n",queue2.getQueue());
}catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println(queue2.headQueue());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
scanner.close();
loop = false;
return;
}
}
}
}
public class Queue2 {
private int maxSize;
private int front;
private int rear;
private int[] numbers;
public Queue2(int maxSize){
this.maxSize = maxSize;
numbers = new int[maxSize];
}
//判断队列是否满了
public boolean isFull(){
return (rear + 1) % maxSize == front;
}
//判断队列是否为空
public boolean isEmpty(){
return rear == front;
}
//添加队列元素
public void addQueue(int number){
if (isFull()){
System.out.println("存满了!");
return;
}
numbers[rear] = number;
rear = (rear + 1) % maxSize;
}
//取出队列中的元素
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空,不能取数据");
}
int value = numbers[front];
front = (front + 1) % maxSize;
return value;
}
public void showQueue(){
if (isEmpty()){
System.out.println("队列为空,没有数据!");
return;
}
for (int i = front ; i < front + size(); i++){
System.out.printf("numbers[%d] = %d\n",i % maxSize,numbers[i % maxSize]);
}
}
//当前队列的有效个数
public int size(){
return (rear + maxSize - front) % maxSize;
}
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空,没有数据");
}
return numbers[front];
}
}