数据结构之队列
队列是一种抽象数据结构,它有下列特性:
①具有先进先出(First in First out)
②拥有两种基本操作:加入与删除,而且使用front与rear两个指针来分别指向队列的前端与末尾
队列的基本运算有以下五种:
Create:建立空队列
Add:将新数据加入队列尾端,返回新队列
Delete:删除队列前端的数据,返回新队列
Front:返回队列前端的值
Empty:若队列为空集,返回真(true),否则返回假(false)
用队列实现数组
下面我们就简单地来实现队列的工作运算,其中声明为queue[20],且一开始front和rear均默认为-1(因为Java语言数组的索引从0开始),表示空队列。加入数据时请输入1,要取出数据时可输入2,将会直接打印队列前端的值。
package 队列;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 队列数组 {
public static int front=-1,rear=-1,max=20;
public static int val;
public static char ch;
public static int queue[]=new int[max];
public static void main(String[] args) throws IOException {
String strM;
int M=0;
BufferedReader keyin=new BufferedReader(new InputStreamReader(System.in));
strM=keyin.readLine();
M=Integer.parseInt(strM);
switch(M) {
case 1:
System.out.print("\n[请输入数组值]:");
strM=keyin.readLine();
val=Integer.parseInt(strM);
rear++;
queue[rear]=val;
break;
case 2:
if(rear>front) {
front++;
System.out.print("\n[取出数值为]:["+queue[front]+"]"+"\n");
queue[front]=0;
}else {
System.out.print("\n[队列已经空了]\n");
break;
}
break;
default:
System.out.print("\n");
break;
}
if(rear==max-1)System.out.println("[队列已经满了]");
System.out.print("\n[当前队列中的数据]:");
if(front>=rear) {
System.out.print("没有\n");
System.out.print("[队列已经空了]\n");
}else {
while(rear>front) {
front++;
System.out.print("["+queue[front]+"]");
}
System.out.print("\n");
}
}
}
运行结果如下:
上面用数组实现队列的算法虽然简单,但是有一个缺点。就是加入的数据限制于数组的长度,如果本来数组就已经满了,删除第一个数据后也不能再加入数据,这是因为只能在数组的后面再加入数据。有一个优化方案,就是删除一个数据就把后面的所有数据向前移动一位,这样就可以删一个后再新增一个。可是数据过多时移动成本就很高(费时间)。所以接下来我们用链表来实现队列就可以无限延长啦~
用链表实现队列
队列除了能用数组来实现,还可以用链表实现。在声明队列类中,除了和队列类中相关的方法外,还必须有指向队列前端及队列尾端的指针,即front和rear。