add array queue
This commit is contained in:
153
src/main/java/io/github/ehlxr/datastructure/ArrayQueueDemo.java
Normal file
153
src/main/java/io/github/ehlxr/datastructure/ArrayQueueDemo.java
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
/*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright © 2020 xrv <xrg@live.com>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.github.ehlxr.datastructure;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用数组模拟队列
|
||||||
|
*
|
||||||
|
* @author ehlxr
|
||||||
|
* @since 2021-03-30 22:26.
|
||||||
|
*/
|
||||||
|
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(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);//接收一个字符
|
||||||
|
switch (key) {
|
||||||
|
case 's':
|
||||||
|
queue.showQueue();
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
System.out.println("输出一个数");
|
||||||
|
int value = scanner.nextInt();
|
||||||
|
queue.addQueue(value);
|
||||||
|
break;
|
||||||
|
case 'g': //取出数据
|
||||||
|
try {
|
||||||
|
int res = queue.getQueue();
|
||||||
|
System.out.printf("取出的数据是%d\n", res);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO: handle exception
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h': //查看队列头的数据
|
||||||
|
try {
|
||||||
|
int res = queue.headQueue();
|
||||||
|
System.out.printf("队列头的数据是%d\n", res);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO: handle exception
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e': //退出
|
||||||
|
scanner.close();
|
||||||
|
loop = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("程序退出~~");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class ArrayQueue {
|
||||||
|
private final int maxSize; // 表示数组的最大容量
|
||||||
|
private int front; // 队列头
|
||||||
|
private int rear; // 队列尾
|
||||||
|
private final int[] arr; // 该数据用于存放数据, 模拟队列
|
||||||
|
|
||||||
|
// 创建队列的构造器
|
||||||
|
public ArrayQueue(int maxSize) {
|
||||||
|
this.maxSize = maxSize;
|
||||||
|
this.arr = new int[maxSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断队列是否满
|
||||||
|
public boolean isFull() {
|
||||||
|
return rear == maxSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断队列是否为空
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return rear == front;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加数据到队列
|
||||||
|
public void addQueue(int n) {
|
||||||
|
if (isFull()) {
|
||||||
|
System.out.println("队列已满,无法添加数据!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
arr[rear++] = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取队列的数据, 出队列
|
||||||
|
public int getQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
throw new RuntimeException("队列为空,无法获取数据!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr[front++];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示队列的所有数据
|
||||||
|
public void showQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
System.out.println("队列为空!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = front; i < rear; i++) {
|
||||||
|
System.out.printf("arr[%d]=%d\n", i, arr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示队列的头数据, 注意不是取出数据
|
||||||
|
public int headQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
throw new RuntimeException("队列为空,无法获取数据!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr[front];
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright © 2020 xrv <xrg@live.com>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package io.github.ehlxr.datastructure;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author ehlxr
|
||||||
|
* @since 2021-03-30 22:52.
|
||||||
|
*/
|
||||||
|
public class CircleArrayQueueDemo {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
//创建一个环形队列
|
||||||
|
CircleArrayQueue queue = new CircleArrayQueue(3);
|
||||||
|
char 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);//接收一个字符
|
||||||
|
switch (key) {
|
||||||
|
case 's':
|
||||||
|
queue.showQueue();
|
||||||
|
break;
|
||||||
|
case 'a':
|
||||||
|
System.out.println("输出一个数");
|
||||||
|
int value = scanner.nextInt();
|
||||||
|
queue.addQueue(value);
|
||||||
|
break;
|
||||||
|
case 'g': //取出数据
|
||||||
|
try {
|
||||||
|
int res = queue.getQueue();
|
||||||
|
System.out.printf("取出的数据是%d\n", res);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO: handle exception
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'h': //查看队列头的数据
|
||||||
|
try {
|
||||||
|
int res = queue.headQueue();
|
||||||
|
System.out.printf("队列头的数据是%d\n", res);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO: handle exception
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'e': //退出
|
||||||
|
scanner.close();
|
||||||
|
loop = false;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
System.out.println("程序退出~~");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CircleArrayQueue {
|
||||||
|
private final int maxSize; // 表示数组的最大容量
|
||||||
|
private int front; // 队列头
|
||||||
|
private int rear; // 队列尾
|
||||||
|
private final int[] arr; // 该数据用于存放数据, 模拟队列
|
||||||
|
|
||||||
|
// 创建队列的构造器
|
||||||
|
public CircleArrayQueue(int maxSize) {
|
||||||
|
this.maxSize = maxSize;
|
||||||
|
this.arr = new int[maxSize];
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断队列是否满
|
||||||
|
public boolean isFull() {
|
||||||
|
return rear - front == maxSize;
|
||||||
|
// return (rear + 1) % maxSize == front;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断队列是否为空
|
||||||
|
public boolean isEmpty() {
|
||||||
|
return rear == front;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加数据到队列
|
||||||
|
public void addQueue(int n) {
|
||||||
|
if (isFull()) {
|
||||||
|
System.out.println("队列已满,无法添加数据!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
arr[(rear++) % maxSize] = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取队列的数据, 出队列
|
||||||
|
public int getQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
throw new RuntimeException("队列为空,无法获取数据!");
|
||||||
|
}
|
||||||
|
int tem = arr[front % maxSize];
|
||||||
|
front++;
|
||||||
|
return tem;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示队列的所有数据
|
||||||
|
public void showQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
System.out.println("队列为空!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = front; i < rear; i++) {
|
||||||
|
System.out.printf("arr[%d]=%d\n", i % maxSize, arr[i % maxSize]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 显示队列的头数据, 注意不是取出数据
|
||||||
|
public int headQueue() {
|
||||||
|
if (isEmpty()) {
|
||||||
|
throw new RuntimeException("队列为空,无法获取数据!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return arr[front];
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user