所谓队列,就是一种特殊的线性表,插入和删除操作都在线性表的两端进行。特点就是先进先出,形象点就是可以联系人们排队的情景,先等待的人先完成目的。
而如同栈一般,队列也分为顺序和链式两种存储结构。
1.顺序队列
对于顺序队列而言,若使用顺序表,则出队效率低,为O(n);若使用数组,则会存在假溢出。所以综上所述,可考虑使用顺序循环队列,即在逻辑上首尾相接的循环结构,,front为队头下标,rear为队尾下标。由图可知,循环队列的所剩元素的长度为(rear-front+length)%length.
2.链式队列
在链式队列中,若使用单链表,入队效率低,所以设计单链表增加尾指针,使得入队和出队操作的时间复杂度为O(1)。
实验
布线问题:印刷电路板将布线区域划分为n×m个方格阵列。布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案要求:
*布线时电路只能沿直线或直角布线。
*已布线方格做上封闭标记,其他线路布线不允许穿过封闭区域。(如下图所示)
import java.util.Scanner;
public class Lab022 {
public int[][] x;//方格阵列;=0表示该方格运行布线;=1表示被封锁,不允许布线
public int size;//方格阵列大小
public int pathLen;//最短线路长度
public LinkedQueue<Position> q;//扩展结点队列,用list存储
public Position start;//起始位置
public Position end;//终点
public Position[] path;//最短路径
public Lab022(int[][] grid,int size,Position start,Position end){
this.x=grid;
this.size=size;
this.start=start;
this.end=end;
}
public static class Position{
public int row;//行
public int col;//列
public Position(int r ,int c){
row=r;
col=c;
}
}
public boolean search(){
if(start.row==end.row&&start.col==end.col){//start==finish,最短路径为0
pathLen=0;
return true;
}
//初始化相对位移
Position[] s=new Position[4];
s[0]=new Position(0,1);//右
s[1]=new Position(1,0);//下
s[2]=new Position(0,-1);//左
s[3]=new Position(-1,0);//上
//设置方格阵列“围墙”,方便处理方格边界的情况
for(int i=0;i<=size+1;i++){
x[0][i]=x[size+1][i]=1;//顶部和底部
x[i][0]=x[i][size+1]=1;//左边和右边
}
Position here=new Position(start.row,start.col);
x[start.row][start.col]=2;//数字0,1表示方格的开放或封锁所以,表示距离时,让所有距离都加2;起始位置的距离为0+2=2
int number=4;//相邻方格数
//以下为标记可达的方格位置
q=new LinkedQueue<Position>();
Position ber=new Position(0,0);
do{
//标记可达的相邻方格
for(int i=0;i<number;i++){
ber.row=here.row+s[i].row;
ber.col=here.col+s[i].col;
if(x[ber.row][ber.col]==0){//该方格未被标记,且该方格允许布线
x[ber.row][ber.col]=x[here.row][here.col]+1;
if(ber.row==end.row&&ber.col==end.col)
break;
q.add(new Position(ber.row,ber.col));
}
}
//检测是否到达目标位置finish
if(ber.row==end.row&&ber.col==end.col)
break;
if(q.isEmpty())
return false;
here=q.poll();
}while(true);
//构造最短布线路径
pathLen=x[end.row][end.col]-2;
path=new Position[pathLen];
//从目标位置finish回溯起始位置
here=end;
for(int j=pathLen-1;j>=0;j--){
path[j]=here;
for(int i=0;i<number;i++){
ber.row=here.row+s[i].row;
ber.col=here.col+s[i].col;
if(x[ber.row][ber.col]==j+2)
break;
}
here=new Position(ber.row,ber.col);
}
System.out.println("最短路线为:");
for(int j=0;j<pathLen-1;j++){
System.out.println("点"+(j+1)+"位置: ("+path[j].row+" ,"+path[j].col+")");//显示位置
}
System.out.println("布线长度为:"+pathLen);
return true;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入方格阵列大小:");
String s1=sc.nextLine();
Integer size=Integer.parseInt(s1);
System.out.println("请输入起始点的行和列,用空格隔开:");
String s2=sc.nextLine();
String[] s3=s2.split(" ");
int startRow=Integer.parseInt(s3[0]);
int startCol=Integer.parseInt(s3[1]);
Position start=new Position(startRow,startCol);
System.out.println("请输入结束点的行和列,用空格隔开:");
String s4=sc.nextLine();
String[] s5=s4.split(" ");
int finishRow=Integer.parseInt(s5[0]);
int finishCol=Integer.parseInt(s5[1]);
Position end=new Position(finishRow,finishCol);
int[][] x=new int[size+2][size+2];
System.out.println("请输入方格阵列:");
for(int i=1;i<=size;i++){
String str=sc.nextLine();
String[] strs=str.split(" ");
for(int j=0;j<strs.length;j++){
x[i][j+1]=Integer.parseInt(strs[j]);
}
}
Lab022 w=new Lab022(x,size,start,end);
w.search();
}
}
本次专题就此结束了,若有错误,敬请指正!