队列
使用场景:像在银行中等待服务,是根据先到先服务的原则提供服务。
队列特点:
-
队列是一个有序列表,可以使用数组或链表来实现
-
遵循着先入先出的原则
设计第一个队列的思路:
- 有一个front和一个rear分别指向队列的头和尾的前一个位置。
- 队列为空的判断是front==rear
- 队列已满的条件是rear==MaxSize-1
选择功能实现:
while (loop){
System.out.println("s:显示队列");
System.out.println("a:添加数据");
System.out.println("g:获取数据");
System.out.println("h:队列头值");
System.out.println("e:退出");
key = scanner.next().charAt(0);
switch (key){
case 's':
try {
queue.showQueue();
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'a':
try {
System.out.println("输入一个添加值:");
int i = scanner.nextInt();
queue.addQueue(i);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'g':
try {
System.out.println(queue.getQueue());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println(queue.headQueue());;
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
loop = false;
break;
default:
System.out.println("请重新输入");
break;
}
}
}
队列的结构和功能代码:
class ArrayQueue{
private int front;
private int rear;
private int maxSize;
private int[] arr;
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
front = -1;//指向队列头的头的前一个位置
rear = -1;//指向队列的尾,指向队列尾的数据
arr = new int[maxSize];
}
//判断队列是否已满
public boolean isFull(){
return rear==maxSize -1;
}
//判断队列是否为空
public boolean isEmpty(){
return front == rear;
}
//添加一个元素到到队列中
public void addQueue(int var){
//判断队列是否已满
if (isFull()){
throw new RuntimeException("队列已满");
}
rear++;//让rear指向队列尾
arr[rear] = var;
}
//出队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
front++;//front移动到出队后的队头前一个
return arr[front];
}
//显示队列中的所有变量
public void showQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
for (int i = front+1; i <=rear ; i++) {
System.out.printf("%d\t",arr[i]);
}
}
//获得队列头数据,非将诗句取出
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
}
完整代码:
package com.yu.queue;
import java.util.Scanner;
/**
* @Description: TODO
* @Author : yu
* Date : 4/1/2020 8:13 PM
*/
public class ArrayQueueDemo {
public static void main(String[] args) {
//测试队列
ArrayQueue queue = new ArrayQueue(3);
char key = ' ';
Scanner scanner = new Scanner(System.in);
boolean loop = true;
while (loop){
System.out.println("s:显示队列");
System.out.println("a:添加数据");
System.out.println("g:获取数据");
System.out.println("h:队列头值");
System.out.println("e:退出");
key = scanner.next().charAt(0);
switch (key){
case 's':
try {
queue.showQueue();
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'a':
try {
System.out.println("输入一个添加值:");
int i = scanner.nextInt();
queue.addQueue(i);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'g':
try {
System.out.println(queue.getQueue());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h':
try {
System.out.println(queue.headQueue());;
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e':
loop = false;
break;
default:
System.out.println("请重新输入");
break;
}
}
}
}
//使用数组模拟列表,编写一个用数组模拟的队列
class ArrayQueue{
private int front;
private int rear;
private int maxSize;
private int[] arr;
public ArrayQueue(int maxSize) {
this.maxSize = maxSize;
front = -1;//指向队列头的头的前一个位置
rear = -1;//指向队列的尾,指向队列尾的数据
arr = new int[maxSize];
}
//判断队列是否已满
public boolean isFull(){
return rear==maxSize -1;
}
//判断队列是否为空
public boolean isEmpty(){
return front == rear;
}
//添加一个元素到到队列中
public void addQueue(int var){
//判断队列是否已满
if (isFull()){
throw new RuntimeException("队列已满");
}
rear++;//让rear指向队列尾
arr[rear] = var;
}
//出队列
public int getQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
front++;//front移动到出队后的队头前一个
return arr[front];
}
//显示队列中的所有变量
public void showQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
for (int i = front+1; i <=rear ; i++) {
System.out.printf("%d\t",arr[i]);
}
}
//获得队列头数据,非将诗句取出
public int headQueue(){
if (isEmpty()){
throw new RuntimeException("队列为空");
}
return arr[front+1];
}
}