add array queue
This commit is contained in:
parent
ab8c68d90f
commit
7697a84edf
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];
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user