@JAVA—通过数组模拟队列
前言
与之前的一样,不用判断队列满的可以先不写队列的大小。
练习指路☞AcWing
一、创建队列
1.队列头
2.队列尾
3.队列大小
4.数组用于存储数据
注意队头和队尾的初始值,添加数据是队尾移动,输出时注意队头的数据
class arrayQueues {
int size;//大小
int front;//队列头
int rear;//队列尾
int[] arr;//存放数据
//创建队列的构造器
public arrayQueues(int arrMaxSize) {
size = arrMaxSize;
arr = new int[size];
front = -1;//只想队列头部,指向队列列头的前一个位置时,初始值为-1
rear = -1;//指向队列尾部,是指向队列尾部的数据(即队列的最后一个数据)
}
}
二、队列调用的方法
2.1注意点
- 遍历队列时,最好用for循环,而不是增强for,这里设置了队列的大小,增强for回输出未添加新数据时的默认值。
- 但队头等于队尾时,队为空。
2.2 代码
//判断队列是否为满
//队尾指向size-1时为满,注意初始值为-1,从0开始计数
public boolean isFull() {
return rear == size - 1;
}
//判断是否为空
public String isEmpty() {
if(rear==front){
return "YES";
}
else{
return "NO";
}
}
//添加数据到队列
public void add(int data) {
if (isFull()) {
System.out.println("队列满,无法加入新数据");
return;
} else {
rear++;
arr[rear] = data;
}
}
//从队头弹出一个数
public void pop() {
if (isEmpty()=="YES") {
System.out.println("队列空,没有数据可以弹出");
return;
} else {
front++;
int res=arr[front];
// System.out.println("从队头弹出一个数"+arr[front+1]);
}
}
//查询队头元素
public void showFront() {
if (isEmpty().equals("Yes")) {
// System.out.println("队列空,没有数据可以弹出");
return;
} else {
//不论是一次都没有取出头数据还是已经取出后的数据都不能使用,应该输出front+1的数据
System.out.println(arr[front+1]);
}
}
//遍历数据
public void show() {
if (isEmpty()=="YES") {
System.out.println("队列空,没有数据可以弹出");
return;
}
for (int i=front+1;i<=rear;i++){
System.out.println(arr[i]);
}
}
三、整体代码
import java.util.Scanner;
/**
* 用数组模拟队列
*/
public class arraysQueue {
static int N=100001;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int M = scanner.nextInt();
String commend;
arrayQueues aq=new arrayQueues(N);
while (M-- > 0) {
commend = scanner.next();
switch (commend) {
case "push":
int x = scanner.nextInt();
aq.add(x);
break;
case "pop":
aq.pop();
break;
case "empty":
String result= aq.isEmpty();
System.out.println(result);
break;
case "query":
aq.showFront();
break;
}
}
}
}
class arrayQueues {
int size;//大小
int front;//队列头
int rear;//队列尾
int[] arr;//存放数据
//创建队列的构造器
public arrayQueues(int arrMaxSize) {
size = arrMaxSize;
arr = new int[size];
front = -1;//只想队列头部,指向队列列头的前一个位置时,初始值为-1
rear = -1;//指向队列尾部,是指向队列尾部的数据(即队列的最后一个数据)
}
//判断队列是否为满
//队尾指向size-1时为满,注意初始值为-1,从0开始计数
public boolean isFull() {
return rear == size - 1;
}
//判断是否为空
public String isEmpty() {
if(rear==front){
return "YES";
}
else{
return "NO";
}
}
//添加数据到队列
public void add(int data) {
if (isFull()) {
System.out.println("队列满,无法加入新数据");
return;
} else {
rear++;
arr[rear] = data;
}
}
//从队头弹出一个数
public void pop() {
if (isEmpty()=="YES") {
System.out.println("队列空,没有数据可以弹出");
return;
} else {
front++;
int res=arr[front];
// System.out.println("从队头弹出一个数"+arr[front+1]);
}
}
//查询队头元素
public void showFront() {
if (isEmpty().equals("Yes")) {
// System.out.println("队列空,没有数据可以弹出");
return;
} else {
//不论是一次都没有取出头数据还是已经取出后的数据都不能使用,应该输出front+1的数据
System.out.println(arr[front+1]);
}
}
//遍历数据
public void show() {
if (isEmpty()=="YES") {
System.out.println("队列空,没有数据可以弹出");
return;
}
for (int i=front+1;i<=rear;i++){
System.out.println(arr[i]);
}
}
}