队列是一个有序列表,可以用数组或是链表来实现。
遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出。
//使用数组模拟队列
class ArrayQueue{
private int maxsize;//数组的最大容量
private int front;//指向队列头
private int rear;//指向队列尾
private int[] arr;//使用数组存放数据,模拟队列
//创建队列的构造器
public arrayqueue(int arrmaxsize){
maxsize=arrmaxsize;
arr=new int[maxsize];
front=-1;//指向队列头部,不包含队列的第一个数据
rear=-1;//指向队列尾部,包含队列的最后一个数据
}
//判断队列是否满
public boolean isFull(){
return rear==maxsize-1;//索引下标是从0开始,所以为maxsize-1
}
//判断队列是否为空
public boolean isEmpty(){
return rear=front;//尾部等于头部时,代表队列为空
}
//将数据添加到队列
public void addqueuue(int n){
//判断队列是否满
if(isFull()){
System.out.println("队列满,不能加入数据");
return;
//java中return的使用:
//作用:1.返回方法指定类型的值(前提是方法的返回值类型不是void)。
//方法的结束,它会结束当前方法。不会执行之后的代码
}
rear++;//让rear后移
arr[rear]=n;//向尾部存入数据
}
//获取队列的数据,出队列
public int getqueue(){
//判断队列是否为空
if(isEmpty()){
//通过抛出异常处理
throw new RuntimeException("队列空,不能取数据");
}
front++;//front后移
return arr[front];
}
}
在上述代码中,由于getqueue有返回值类型,所以在if语句中,无法通过sout方式(return无法使用)来输出结果。
注:
Java中return用于方法,两个作用:
- 返回方法指定类型的值(这个值总是确定的),也可以是对象
- 方法的结束
两种形式:
- 有返回值类型 例如:return i;
- 无返回值类型。直接return;
//显示队列的所有数据
public void showqueue(){
//遍历
if(isEmpty()){
System.out.println("队列空,没有数据");
return;//结束方法
}
for(int i=0;i<arr.length;i++){
System.out.printf("arr[%d]=%d\n",i,arr[i]);
}
}
//显示队列的头数据,只是显示,不是取出数据
public int headqueue(){
//判断是否为空
if(isEmpty()){
throw new RuntimeException("队列空,没有数据");
}
return arr[front+1];//因为front是从-1开始的,所以需要+1
}
//实现数组
//创建一个队列
ArrayQueue arrayQueue=new ArrayQueue(3);
cher key =' ';//接收用户输入字符
Scanner scanner=new Scanner(System.in);
boolean loop=true;
while(loop){
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("g(get):从队列中取出数据");
System.out.println("h(head):查看队列头的数据");
key=scanner.next().charAt(0);//接收一个字符,java规定。就这么写
switch(key){
case='s':
arrayQueue.showqueue();
break;
case='a':
System.out.println("请输入一个数字");
int value=scanner.nextInt();
arrayQueue.addqueue(value);
break;
case='g':
try{
int res=arrayQueue.getqueue();
System.out.printf("取出的数据是%d\n",res);
}catch(Exception e){
System.out.println(e.getMessage());//打印异常信息
}
break;
case='h':
try {
int res=arrayQueue.headQueue();
System.out.printf("队列头的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case='e':
scanner.close();//关闭输入
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");