1.队列的基本介绍
队列是一种特殊的线性表,这种特殊的线性表只能在一端插入数据,然后在另一端删除数据。队列中的插入操作一般叫入队,删除操作一般叫出队。队列的这种特殊性,使其具有先进先出(FIFO-first in first out)的性质,这就类似于现实生活中的排队打饭,先来排队的同学先打到饭,后来的同学排到队伍的末尾。
2.队列的基本操作
-
入队:在队列末尾插入元素
-
出队:删除队首元素
3. 队列的种类
-
顺序队列
-
循环队列
-
链式队列
4.顺序队列
顺序队列在创建的时候要分配一块连续的存储空间,作为存储队列元素的空间,同时还设置两个指针,front和rear指针管理队列,其中front是队首指针,rear是队尾指针,当进行入队操作的时候rear加1,对于出队操作,front有两种方案:一种是front指针移动,另一种是front指针静止。
- front指针静止:对于front静止的方案,在进行出队操作的时候,front指针位置不变,把队首元素从队列中删除后,把后面的元素依次向前移动一位。很显然,这种方案的缺点就是频繁出队要搬移大量元素。
演示动画:
- 入队
顺序队列入队
2. 出队
front静止出队
3. 实现代码:
public boolean enqueue(T item) {
if(isEmpty()){
front = 0;
rear = 0;
queueArray[rear] = item;
return true;
}else if(isFull()){
return false;
}else {
rear ++;
queueArray[rear] = item;
return true;
}
}
//出队
public T dequeue() {
if(isEmpty()){
return null;
}else {
T item = queueArray[front];
//元素依次向前移动
for(int i = 0; i < rear; i++){
queueArray[i] = queueArray[i+1];
}
queueArray[rear] = null;
rear --;
if (rear == -1){ // 判断是否是最后一个元素出队
front = -1;
}
return item;
}
}
- front指针移动:在front指针移动中,元素出队后,front指针将移动到下一个元素,显然