数据结构中队列的简单分析和代码实现

@数据结构中的队列(以下代码为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.分析完美的实现的队列的复用,得到了我们想要的结果!
`

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值