队列介绍
队列时一个有序列表,可以用数组 或者链表 来实现。 遵循先进先出 的原则。即:先存入队列的数据,要先取出。后存入的数据,后取出。 示意图:(使用数组模拟队列的示意图)
数组模拟队列
队列本身时有序列表,若使用数组的结构来存储队列的数据,则队列数据的声明如上如,其中maxSize是该队列的最大容量 因为队列的输入、输出分别从前后端来处理,因此声明两个变量front和rear 分别记录队列的前后端的下标,front会随着数据输出而改变,rear会随着数据输入而改变(如上图)
代码思路分析
front指向第一个元素 rear指向最后一个元素的后一个空间 当队列满时,(rear+1)%maxSize=front 当队列为空时,rear = front 队列中有效数据的个数:(rear+maxSize-front)%mazSize 【注意思考:为什么要留一个空位?】 因为要防止【队列空】和【队列满】条件相同
int maxSize;
int front;
int rear;
int [ ] arr;
代码实现队列
public class MyQueue {
private int maxSize;
private int front;
private int rear;
private int [ ] arr;
public MyQueue ( ) {
}
public MyQueue ( int maxSize) {
this . maxSize = maxSize+ 1 ;
this . arr = new int [ maxSize+ 1 ] ;
this . front = 0 ;
this . rear = 0 ;
}
private boolean isFull ( ) {
if ( ( rear+ 1 ) % maxSize== front) {
return true ;
} else {
return false ;
}
}
private boolean isEmpty ( ) {
if ( this . rear== this . front) {
return true ;
} else {
return false ;
}
}
private void offer ( int data) {
if ( ! isFull ( ) ) {
arr[ rear] = data;
rear = ( rear+ 1 ) % maxSize;
} else {
System. out. println ( "队列已满" ) ;
}
}
private int poll ( ) {
if ( ! isEmpty ( ) ) {
int value = arr[ front] ;
front = ( front+ 1 ) % maxSize;
return value;
} else {
throw new RuntimeException ( "队列为空" ) ;
}
}
private void showQueue ( ) {
int size = size ( ) ;
for ( int i= front; i< front+ size; i++ ) {
System. out. printf ( "arr[%d]=%d\n" , i% maxSize, arr[ i% maxSize] ) ;
}
}
private int size ( ) {
return ( rear+ maxSize- front) % maxSize;
}
public static void main ( String[ ] args) {
MyQueue queue = new MyQueue ( 5 ) ;
queue. offer ( 1 ) ;
queue. offer ( 2 ) ;
queue. offer ( 3 ) ;
queue. offer ( 4 ) ;
queue. offer ( 5 ) ;
queue. offer ( 6 ) ;
queue. poll ( ) ;
queue. offer ( 6 ) ;
queue. showQueue ( ) ;
queue. poll ( ) ;
queue. poll ( ) ;
queue. poll ( ) ;
queue. poll ( ) ;
queue. poll ( ) ;
queue. poll ( ) ;
}
}