@数据结构中的队列(以下代码为java语言)
数据结构中的队列分析与代码实现
算法和数据结构对于我们来说至关重要,那我今天想聊一下队列有问题欢迎大家讨论!@一只大狗头
队列
1.基本概念先入先出
代码实现:`package com.dog;
import java.util.Scanner;
/**
-
@Author big dog
-
Date on 2020/8/21 23:21
*/
public class Queque2 {
public static void main(String[] args) {
ArrayQueque1 arrayQueque1 = new ArrayQueque1(3);
char a = ’ ';
Scanner scanner = new Scanner(System.in);
boolean bool = true;
while (bool){
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): 查看队列的头部”);
a = scanner.next().charAt(0);
switch (a){
case ‘s’:
arrayQueque1.showArray();
break;case 'a': System.out.println("请输入一个数据:"); int value = scanner.nextInt(); arrayQueque1.addArray(value); break; case 'g': try { int get = arrayQueque1.getArray(); System.out.println("取出的数据为" +get); }catch (Exception e){ System.out.println(e.getMessage()); } break; case 'h' : try { int res = arrayQueque1.headArray(); System.out.println("对列头部为" +res); }catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e' : scanner.close(); bool = false; System.out.println("程序已经退出······"); break; default: break; } }
}
}class ArrayQueque1{
private int maxSize;
private int rear;
private int front;
private int[] arr;public ArrayQueque1(int ArraymaxSize){ maxSize = ArraymaxSize; arr = new int[maxSize]; rear = -1; front = -1; } public boolean isFull() { return rear == maxSize - 1; } public boolean isEmpty(){ return rear == front; } public void addArray(int n){ if (isFull()){ System.out.println("队列已经满了,无法加入数据"); return; } rear ++; arr[rear] = n; } public int getArray(){ if (isEmpty()) { throw new RuntimeException("队列为空"); } front++; return arr[front]; } public void showArray(){ if(isEmpty()){ System.out.println("队列为空,没有数据"); return; } for (int i = 0; i < arr.length; i++) { System.out.printf("arr[%d] = %d\n",i,arr[i]); } } public int headArray(){ if (isEmpty()){ throw new RuntimeException("队列为空,没有数据"); } return arr[front + 1]; }
}
分析:
1.运行结果
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
队列为空,没有数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
10
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
40
队列已经满了,无法加入数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
arr[0] = 10
arr[1] = 20
arr[2] = 30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为10
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
队列为空,没有数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
10
队列已经满了,无法加入数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
`
2.从以上结果可以看出代码实现了一次队列,然而在接下来的一轮队列无法完成这个为一次队列,这并不是我们想要的结果。
代码改进(环形队列)
代码实现:`package com.dog;
import java.util.Scanner;
/**
-
@Author big dog
-
Date on 2020/8/22 17:28
*/
public class HuanxinQueque {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println(“请输入队列最多要存贮多少个数据”);
Queque03 queque03 = new Queque03(scanner.nextInt());
char a = ’ ';
boolean bool = true;
while (bool) {
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): 查看队列的头部”);
a = scanner.next().charAt(0);
switch (a) {
case ‘s’:
queque03.showArray();
break;case 'a': System.out.println("请输入一个数据:"); int value = scanner.nextInt(); queque03.addArray(value); break; case 'g': try { int get = queque03.getArray(); System.out.println("取出的数据为" + get); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'h': try { int res = queque03.headQueque(); System.out.println("对列头部为" + res); } catch (Exception e) { System.out.println(e.getMessage()); } break; case 'e': scanner.close(); bool = false; System.out.println("程序已经退出······"); break; default: break; } } }
}
class Queque03{ private int rear; private int front; private int[] arr; private int maxSize; public Queque03(int arrayMaxsize){ maxSize = arrayMaxsize; arr = new int[maxSize]; } public boolean isFull() { return (rear + 1)%maxSize == front; } public boolean isEmpty() { return rear == front; } public void addArray(int n){ if(isFull()){ System.out.println("改队列已经满了,无法加入数据"); return; } arr[rear] = n; rear = (rear + 1)%maxSize; } public int getArray(){ if(isEmpty()){ throw new RuntimeException("队列为空,无法取出数据"); } int value = arr[front]; front = (front + 1)%maxSize; return value; } public void showArray(){ if(isEmpty()){ System.out.println("队列为空,没有数据"); return; } for (int i = front; i < getnum() + front; i++) { System.out.printf("arr[%d] = %d\n" , i%maxSize , arr[i%maxSize]); } } public int getnum(){ return (rear + maxSize - front)%maxSize; } public int headQueque(){ if (isEmpty()) { throw new RuntimeException ("队列为空,没有数据"); } return arr[front]; } }
分析:
1.调试结果
请输入队列最多要存贮多少个数据
4
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
队列为空,没有数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
10
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
40
改队列已经满了,无法加入数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
arr[0] = 10
arr[1] = 20
arr[2] = 30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为10
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
取出的数据为30
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
g
队列为空,无法取出数据
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
a
请输入一个数据:
20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
s
arr[3] = 20
s(show): 显示队列
e(exit): 退出程序
a(add): 添加数据到队列
g(get): 从队列中取出数据
h(head): 查看队列的头部
2.分析完美的实现的队列的复用,得到了我们想要的结果!
`