队列
是一种先进先出(FIFO)的线性表,只能在表的一端(队尾)进行插入,在另一端(队头)进行删除运算的线性表。
逻辑结构:与线性表相同,仍为一对一关系
存储结构:用顺序队列或链队存储均可
运算规则:先进先出(FIFO)
实现方式:关键是编写入队和出队的函数,具体实现 依顺序对或链队的不同而不同
实现
线性表有顺序存储和链式存储,队列是一种特殊的线性表,同样也存在这两种存储方式。
解决假溢出:顺序循环队列
如何判断循环队列究竟是空的还是满的
现在问题又来了,我们之前说,空队列时,front指针等于rear指针,那么现在循环队列满的时候,也是front等于rear,那么如何判断循环队列究竟是空的还是满的?有如下办法:
办法1:设置一个标志位flag。初始时置flag=0;每当入队列操作成功就置flag=1;每当出队列操作成功就置flag=0。则队列空的判断条件为:rear == front && flag==0;队列满的判断条件为:rear = = front && flag= =1。
办法2:保留一个元素的存储空间。此时,队列满时的判断条件为 (rear + 1) % maxSize == front;队列空的判断条件还是front == rear。
办法3:设计一个计数器count,统计队列中的元素个数。此时,队列满的判断条件为:count > 0 && rear == front ;队列空的判断条件为count == 0。
队列的常用操作
入队、出队(返回队首元素并且删除队首元素)、判断队列是否已满、判断队列是否为空、获取队首元素(只是获取队首元素,但不删除)
实现代码
package org.lanqiao.queue;
/*
* 接口:针对队列操作的规范
*/
public interface IQueue {
/*
* 入队
*/
public void inputQueue(Object obj);
/*
* 出队
*/
public Object outputQueue();
/*
* 判断队列是否已满
*/
public boolean isMax();
/*
* 判断队列是否为空
*/
public boolean isEmpty();
/*
* 获取队首元素
*/
public Object getQueueFront();
}
package org.lanqiao.queue;
public class Queue implements IQueue{
private int front = 0 ;//队首标记
private int rear = 0;//队尾标记
private int size = 0;//队列中元素的个数
private Object[] que;//队列的底层本质
private int capacity = 10;//队列的默认容量
public Queue() {
que = new Object[capacity];
}
public Queue(int capacity) {
que = new Object[capacity];
this.capacity = capacity;
}
@Override
public void inputQueue(Object obj) {
//判断队列是否已满
if(isMax()) {
System.out.println("队列已满");
return;
}
rear = (rear + 1)%capacity;
if(rear == 0) {
rear = 1;
}
que[rear] = obj;
size++;
}
@Override
public Object outputQueue() {
if(!isEmpty()) {
front = (front + 1 )%capacity;
if(front==0) {
front = 1;
}
size--;
return que[front];
}
System.out.println("队列为空");
return null;
}
/*
* 办法2:保留一个元素的存储空间。
* 此时,队列满时的判断条件为 ( rear + 1) % maxSize == front;
* 队列空的判断条件还是front == rear
*/
@Override
public boolean isMax() {
return (size + 1) == capacity;
}
@Override
public boolean isEmpty() {
return front == rear;
}
@Override
public Object getQueueFront() {
return que[front + 1];
}
public void print() {
for(int i = 1 ; i <capacity; i++) {
System.out.println(que[i]);
}
}
}
package org.lanqiao.queue;
public class Test {
public static void main(String[] args) {
Queue q = new Queue(5);
q.inputQueue("1");
q.inputQueue("2");
q.inputQueue("3");
q.inputQueue("4");
q.inputQueue("5");
q.print();
System.out.println("---------------");
System.out.println(q.outputQueue());
System.out.println(q.outputQueue());
System.out.println(q.getQueueFront());
q.inputQueue("5");
q.inputQueue("6");
System.out.println("---------------");
q.print();
System.out.println(q.getQueueFront());
}
}