数组模拟队列
方式一:普通队列
这种方式数组只是使用一次
private int front;//模拟头指针
private int rear;//模拟尾指针
private int Maxsize;//模拟队列最大容量
private int[] array;//模拟队列存放数据
//构造方法初始化数组
public ArrayQueueDemo(int maxsize) {
this.front = -1;//指向队列头元素的前一个
this.rear = -1; //指向队列的最后一个元素
Maxsize = maxsize;
this.array = new int[Maxsize];
}
栈满的条件:front == rear
栈空的条件:rear == Maxsize - 1;
入队:
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
rear++;//尾指针后移
array[rear] = n;//把元素放进数组
}
出队:
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空!!");
}
front++;//后移一位
return array[front];//取出数据
}
方式二(改进):环形
此种方式改变front和rear的定义来实现环形队列,但是必须牺牲一个空间. 也就是说一开始设立的数组永远不能装满
栈满的条件:(rear+1)%Maxsize == front
栈空的条件:front == rear
出队:
/*出队列*/
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空!!");
}
int value = array[front];
front = (front+1)%Maxsize;//取模后 每次取到队列最后一个时,便会从0开始取
return value;//取出数据
}
入队:
/*向队列添加元素(入队列)*/
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
array[rear] = n;//把元素放进数组
System.out.println("rear="+rear+"n:"+n);
rear = (rear+1)%Maxsize;//取模后 每次队列满的时候,取出后,下次再存便是从0开始
}
完整队列类代码
class Circlequeue{
private int front;//指向队列第一个元素
private int rear;//指向队列最后一个有效元素的后一个位置(始终是空的)
private int Maxsize;//模拟队列最大容量
private int[] array;//模拟队列存放数据
//初始化
public Circlequeue(int maxsize) {
this.front = 0;//不写也可以 默认为零
this.rear = 0; //
Maxsize = maxsize;
array = new int[Maxsize];
}
/*判断队列是否为空*/
public boolean isEmpty() {
return front == rear;
}
/*判断队列是否满*/
public boolean isFull() {
return (rear+1)%Maxsize == front;
}
/*向队列添加元素(入队列)*/
public void addQueue(int n) {
if (isFull()) {
System.out.println("队列已满");
return;
}
array[rear] = n;//把元素放进数组
System.out.println("rear="+rear+"n:"+n);
rear = (rear+1)%Maxsize;//取模后 每次队列满的时候,取出后,下次再存便是从0开始
}
/*出队列*/
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列为空!!");
}
int value = array[front];
front = (front+1)%Maxsize;//取模后 每次取到队列最后一个时,便会从0开始取
return value;//取出数据
}
/*打印当前队列里的信息*/
public void getall() {
if (isEmpty()) {
System.out.println("队列为空");
}
for (int i = front; i <front+getsize(); i++) {
//当队列一个元素在array[maxsize-1],一个在array[0]时,front=maxsize-1,getsize=2;
//所以i是可能等于maxsize 甚至maxsize+1 所以要 i%Maxsize
System.out.println("队列里的元素为:array["+i%Maxsize+"]"+array[i%Maxsize]);
}
}
/*求有效数据个数*/
public int getsize(){
//当存了maxsize-1次(此时已经不能再存了 因为一个预留空间)时,取一个(取出一个后又可以存),再存一个(这时有数据的是1到maxsize)
// 也就是说maxsize可以存数据 但必须是0号为空的前提下(最多只可以放maxsize-1个数据 这些数据可以再数组的任意连续maxsize-1个位置)
// 这时rear<front 所以要加maxsize
return (rear+Maxsize-front)%Maxsize;
}
/*求数据头*/
public int gethead(){
if (isEmpty()) {
System.out.println("队列为空");
}
return array[front];
}
}