队列(Queue)——先进先出线性表,队列结构具有特殊的运算规则,从数据的逻辑结构来看,队列结构是一种线性表;从数据的存储结构来看,队列结构分为顺序队列结构和链式队列结构;
- 顺序队列结构:使用一组地址连续的内存单元依次保存队列中的数据。
- 链式队列结构:使用链表形式保存队列中各元素的值。
从上图中可以看出,在队列结构中允许对两端进行操作,但两端的操作不同,只能在表的一端进行删除,称为队头;在表的另一端进行插入,称为队尾,如果队列中没有数据元素,称为空队列。
队列中常用的操作:
-
入队列:将一个元素添加到队尾(相当于到队列最后排队等候)。
- 首先判断队尾(tail),tail等于MSXLEN(队列结构数组最大长度)表示溢出,进行错误处理,否则进行下一步。
- 将入队列元素保存到tail指向的位置;
- 设置队尾tail=tail+1;
- 出队列:将队头的元素取出,同时删除该元素,使后一个元素成为队头。
- 首先判断队头(head),head等于tail表示空队列,进行错误处理,否则进行下一步。
- 从队列首部取出队头元素(实际是返回队头元素的引用)。
- 修改队头head=head+1;
对顺序队列的设计步骤:
- 定义队列结构(QueueType)
- 初始化队列(queueInit)
- 计算队列大小(queueLen)
- 入队列(queueAdd)
- 出队列(queueOut)
代码实现:
一,定义结点
public class Data {//定义结点
String name;
int age;
}
二,实现队列结构
public class Queue {
QueueType qt;//定义全局头引用
class QueueType{//定义队列结构
static final int MAXLEN=20;
Data[] data=new Data[MAXLEN];
int head;//队头
int tail;//队尾
}
void queueInit(){//初始化队列结构
if((qt=new QueueType())!=null){
qt.head=0;
qt.tail=0;
}
}
int queueLen(){//计算队列中元素的个数
return qt.tail-qt.head;
}
int queueAdd(Data d){//入队列
if(qt.tail>=qt.MAXLEN){
System.out.print("队列溢出!");
return 0;
}
qt.data[qt.tail++]=d;
return 1;
}
Data queueOut(){//出队列
if(qt.head==qt.tail){
System.out.print("队列为空!");
return null;
}
return qt.data[qt.head++];
}
}
三,运行测试
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Queue dt = new Queue();
dt.queueInit();
while (true) {
System.out.println("请输入:0(退出),1(入队列),2(出队列),3(队列大小)");
int i = in.nextInt();
switch (i) {
case 0:
return;
case 1:
Data d = new Data();
System.out.print("添加姓名:");
String name = in.next();
System.out.print("添加年龄:");
int age = in.nextInt();
if (name == null || age == 0) {
System.out.println("信息不能为空");
break;
}
d.age = age;
d.name = name;
int temp1 = dt.queueAdd(d);
if (temp1 == 0) {
System.out.println("入队失败");
break;
}
System.out.println("入队成功");
break;
case 2:
Data data = dt.queueOut();
if (data == null) {
System.out.println("出队失败");
break;
}
System.out.println("出队成功");
System.out.println("姓名:" + data.name + "" + "年龄:" + data.age);
break;
case 3:
System.out.println("栈的大小为:" + dt.queueLen());
break;
default:
break;
}
}
}