一、队列的含义及特点
- 含义:队列是一个数据呈线性排列的数据结构,可以用数组和链表来实现。
- 特点:先进先出,队列中添加和删除数据的操作分别是在两端进行的。
二、图解
三、用数组模拟单链队列
一)、思路
1、确定队列的长度(maxSize)
2、确定队列的首尾(front、rear)
- front 指向队列首,随数据的取出而改变,初始值为-1,代表队列首的前一个位置
- rear:指向队列尾,随数据的添加而改变,初始值为-1,代表队列尾的当前位置
3、确定队列的功能
①添加数据(addQueue)
a、判断是否满(isFull)
- rear == maxsize-1
b、每添加一个数据,rear+1 注意:要先加一再取数据
②取出数据(getQueue)
a、判断是否为空(isEmpty)
- rear == front
-
可以通过throw new RuntimeException();抛出异常来阻止数据的取出
b、取出数据,front+1,注意:要先加一再取数据
③查看队列(showQueue)
a、若为空,打印队列为空
b、否则,按照遍历数组的方式查看队列
④查看队列首的数据(headQueue)
同③,注意:front指的是队列首的前一个位置,所以在查看的时候索引值应该为front+1
4、代码实现
package Queue;
import java.util.Scanner;
public class ArrayLineQueue {
public static void main(String[] args) {
ArrQuene arrQuene = new ArrQuene(3);
fun();
char key = ' ';
boolean run = true;
while (run) {
key = new Scanner(System.in).next().charAt(0);
switch (key) {
case 's':
arrQuene.showQueue();
break;
case 'a':
arrQuene.addQueue();
break;
case 'g':
try{
int res = arrQuene.getQueue();
System.out.println("取出的数据为:" + res);
}catch (Exception e){
//TODO:handle exception
System.out.println(e.getMessage());
}
break;
case 'h':
try{
int res = arrQuene.headQueue();
System.out.println("队列头为:" + res);
}catch (Exception e){
//TODO:handle exception
System.out.println(e.getMessage());
}
break;
case 'e':
System.out.println("程序结束");
run = false;
break;
default:
break;
}
}
}
public static void fun() {
System.out.println("===查看队列(s)===");
System.out.println("===添加数据(a)===");
System.out.println("===取出数据(g)===");
System.out.println("===查看队列首(h)===");
System.out.println("===退出程序(e)===");
}
}
class ArrQuene {
private int maxsize;
private int rear;
private int front;
private int[] arr;
//队列构造器
public ArrQuene(int maxsize) {
this.maxsize = maxsize;
arr = new int[maxsize];
rear = -1;
front = -1;
}
public boolean isFull() {
return rear == maxsize - 1;
}
public boolean isEmpty() {
return rear == front;
}
public void addQueue() {
if (isFull()) {
System.out.println("队列满不可加");
return;
}
System.out.print("请输入一个数据:");
int addnum = new Scanner(System.in).nextInt();
rear++;
arr[rear] = addnum;
}
public int getQueue() {
if (isEmpty()) {
throw new RuntimeException("队列空,不能取数据");
}
return arr[++front];
}
public void showQueue() {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public int headQueue() {
if (isEmpty()) {
throw new RuntimeException("队列空,无数据");
}
return arr[front + 1];
}
}
5、分析问题
①在循环和switch之间处理不得当,导致死循环。
问题代码
改正代码
②异常处理不到位
6、运行结果
由此可见:
- 数组模拟的链表的取数据并不是真正的把数组里面的数据取出恢复为空
- 且指针rear和front走完一遍便不会回到队首
- 导致该链表只能一次性使用