数组实现简单队列
我们为了更好地理解队列,就会自己写一个队列,这次我们用数组来实现队列。
第一步知道队列的属性
通过应用,我们不难发现队列是一个先进先出的一种结构,而这种结构往往需要索引,那么我们就需要定义索引,还有用数组实现队列,数组是一个给定空间大小就不能改变的结构,所以用数组来实现队列,我们也要给定一个最大容量,还有就是用来实现队列的数组,所以我们定义一下属性:
private int maxSize;//队列的最大容量
private int front;//队列头 初始值为-1 指向队列头的前一个位置
private int rear;//队列尾 初始值为-1 指向队尾的具体位置
private int[] arr;//用于存放队列的数组
定义好了以后我们需要知道队列什么时候满了,当添加数据到队列时,队列头不动,队列尾加入数据,即rear先自增,然后加入数据,那么,当rear==maxSize-1(从零开始)时就表示队列已满。
//判断队列是否满
public boolean isFull(){
return rear == maxSize-1;
}
还有我们得知道队列什么时候为空,从上面可以知道,当rear==front时,队列为空。
//判断队列是否为空
public boolean isEmpty(){
return front==rear;
}
向队列添加数据时,rear先自增再加入数据,即
//添加数据到队列
public void addQueue(int num){
//先判断是否满
if(isFull()){
throw new RuntimeException("队列已满,不能添加数据!");
}
rear++;//让rear后移
arr[rear]=num;
}
出队列的时候,我们知道front指向队列头的前一个位置,那么将front后移就指的是队列头元素,即
//获取队列元素,出队列
public int getQueue(){
//判断是否为空
if(isEmpty()){
//抛出异常处理
throw new RuntimeException("队列为空,不能取数据!");
}
front++;//后移
arr[front]=0;
return arr[front];
}
遍历队列
//显示队列所有元素
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];
}
当我们写好以后,就测试一下:
package com.algo.queue.arrayqueue;
import java.util.Scanner;
public class ArrayQueueDemo {
public static void main(String[] args) {
//创建一个队列
ArrayQueue arrayQueue = new ArrayQueue(3);
char key;//接收用户输入
Scanner scanner = new Scanner(System.in);
boolean flag = true;//死循环菜单
while (flag){
//菜单
System.out.println("s(show):显示队列数据");
System.out.println("h(head):显示队列的头数据");
System.out.println("g(get):取出队列数据");
System.out.println("a(add):添加数据到队列");
System.out.println("e(exit):退出程序");
key = scanner.next().charAt(0);//接收用户输入
switch (key){
case 's'://遍历队列
arrayQueue.showQueue();
break;
case 'h'://显示数组的头元素
try {
System.out.println(arrayQueue.headQueue());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'g'://获取队列元素
try {
System.out.println(arrayQueue.getQueue());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'a'://向队列添加元素
try {
int num=scanner.nextInt();
arrayQueue.addQueue(num);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e'://程序退出
scanner.close();
flag=false;
break;
default:
break;
}
}
System.out.println("程序退出...");
}
}
数组实现队列的完整代码
package com.algo.queue.arrayqueue;
//使用数组模拟队列
public 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;
}
//判断队列是否为空
public boolean isEmpty(){
return front==rear;
}
//添加数据到队列
public void addQueue(int num){
if(isFull()){
throw new RuntimeException("队列已满,不能添加数据!");
}
rear++;//让rear后移
arr[rear]=num;
}
//获取队列元素,出队列
public int getQueue(){
//判断
if(isEmpty()){
//抛出异常处理
throw new RuntimeException("队列为空,不能取数据!");
}
front++;//后移
arr[front]=0;
return arr[front];
}
//显示队列所有元素
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];
}
//获取队列的元素个数
public int getQueueNum(){
return rear-front;
}
}
当我们测试以后会发现一个问题,就是这样实现以后队列只能用一次,为了解决这一问题我们引出环形队列的思想,请观看下集环形队列。