数据结构与算法-队列(1)
队列简介:队列是一种线性数据结构,具有先进先出(FIFO)特性,在实现中既可以通过数组实现,又可以通过链表来进行实现。
数组模拟队列思路:因为队列为有序列表,定义数组必须要要给出具体长度,所以定义的数组长度为队列的最大容量maxsize,因为队列输入输出分别从前后端来处理,因此需要两个变量front及rear分别记录队列前后端的下标,front会随数据的输出而改变,而rear则是随着数据的输入而改变。
将数据插入队列时叫入队,需要将尾针后移 即rear+1 ,若尾指针rear小于 队列的最大下标maxsize - 1,则将数据存入rear所指的数组元素中,否则无法存入数据。rear == maxsize-1 表示队列已满。
队列一般提供的属性方法:
队列容量
队列头元素下标
队列尾元素下标
保存队列数据的数组
判断队列是否已满
判断队列是否为空
入队操作
出队操作
显示队列所有数据
显示队列头部数据
实现案例:
`package com.尚硅谷数据结构预算法.day02;
import java.util.Scanner;
/**
* @Author by lc
* @Date 2020/11/3 0003 14:04
* @Version 1.0
* 数组实现队列
* 问题:队列只能使用一次不能达到复用的效果
*/
public class QueueArrayDemo {
public static void main(String[] args) throws Exception {
//创建一个队列
QueueArray queueArray = new QueueArray(3);
char key = ' ';//接收用户输入
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.println("s(show):显示队列\t\n" +
"e(exit):退出程序\t\n" +
"a(add):添加数据到队列\t\n" +
"g(get):从队列中取出一个数据\t\n" +
"p(peek):查看队列头部元素\t\n");
key = scanner.next().charAt(0);
switch (key) {
case 's':
queueArray.showQueue();
break;
case 'a':
System.out.println("请输入一个数");
int value = scanner.nextInt();
queueArray.addQueue(value);
break;
case 'g':
System.out.println(queueArray.getQueue() + "");
break;
case 'p':
System.out.println(queueArray.peek());
break;
case 'e':
System.out.println("退出程序");
break;
}
}
}
}
//使用数组实现一个队列
class QueueArray {
private int maxsize;//队列最大长度也是数组长度
private int front;//队列头 出队时会变动(队列第一个元素的前一个位置的下标)
private int rear;//队列尾 入队时会变动(就是队列最后一个元素的下标)
private int[] arr;//用于存储数据模拟队列
//构造方法初始化 队列
public QueueArray(int maxsize) {
this.maxsize = maxsize;
front = -1;
rear = -1;
arr = new int[maxsize];
}
//判断队列是否为空
public boolean isEmpty() {
return front == rear;
}
//判断队列是否已满
public boolean isFull() {
if (rear == (maxsize - 1)) {
return true;
}
return false;
}
//入队操作
public void addQueue(int num) {
//校验队列是否已满
if (isFull()) {
System.out.println("队列已满,不允许入队操作");
} else {
rear++;
arr[rear] = num;
}
}
//出队操作
public int getQueue() throws Exception {
if (isEmpty()) {
throw new Exception("队列为空,暂无数据可取");
}
front++;
return arr[front];
}
//展示队列
public void showQueue() {
if (isEmpty()) {
System.out.println("队列为空");
return;
}
for (int i = front + 1; i <= rear; i++) {
System.out.printf("arr[%d]=%d\n", i, arr[i]);
}
}
//查看队列头数据
public int peek() throws Exception {
if (isEmpty()) {
throw new Exception("队列为空,暂无数据可取");
}
return arr[front + 1];
}
}
`