数据结构--使用数组模拟队列

目录

1.场景

2.分析问题

3.队列的基本介绍

4.步骤分析

5.代码演示


1.场景

        在营业厅、银行取号排队,等待业务员叫号进行服务。

2.分析问题

        当然是要遵循先来后到的原则,先来的人排号排在前面,先进行服务。

        这个时候就可以用到队列的数据结构。

3.队列的基本介绍

  1. 队列是一个有序列表,可以用数组或者链表来实现。

  2. 遵循先入先出的原则。

  3. 使用数组模拟队列的示意图:

MaxSize:表示这个队列能够存放多少数据。

front:队列头,表示第一个数据的前一位的位置。

rear:队列尾,表示最后一个数据的位置。

4.步骤分析

  1. 在一个队列当中,会有如下几个属性:队列最大存储数量、队列头、队列尾。队列头就是第一条数据的位置-1,队列尾就是最后一条数据的位置。

  2. 在添加数据的时候要先判断队列是否满了,如果队列头+1等于队列尾则说明队列满了。

  3. 添加数据时,往队列尾+1的位置存放数据,并将队列尾向后移动一位。

  4. 在取出数据时,要先判断队列是否为空,如果队列头等于队列尾则说明队列满了。

  5. 取出数据时,队列头+1的位置取出,并将队列头向后移动一位。

5.代码演示

package com.study.queue;

import java.util.Arrays;
import java.util.InputMismatchException;
import java.util.Scanner;

public class ArrayQueueDemo {
    public static void main(String[] args) {

        //用户输入
        Scanner scanner = new Scanner(System.in);
        int maxSize = 0;
        Boolean isFirstQueue = true;
        int haveQueue = 0;
        ArrayQueueTest queue = null;
        Boolean loop = true;
        Scanner sc1 = null;
        Scanner sc2 = null;
        while (loop){
            while (haveQueue==0){
                if (isFirstQueue) {System.out.println("请定义队列的长度:");}
                try {
                    sc1 = new Scanner(System.in);
                    maxSize = sc1.nextInt();
                    haveQueue = 1;

                } catch (Exception e) {
                    System.out.println("请输入正确的数字:");
                }
                isFirstQueue = false;
            }
            while (haveQueue == 1) {
                queue = new ArrayQueueTest(maxSize);
                haveQueue = 2;
            }

            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):查看头数据");
            char c = scanner.next().charAt(0);
            switch (c){
                case 's':
                    queue.showQueue();
                    break;
                case 'e':
                    loop = false;
                    System.out.println("程序结束喽,下班~");
                    break;
                case 'a':
                    Boolean flga = true;
                    int num = 0;
                    while (flga){
                        try {
                            System.out.println("请输入要插入的数据:");
                            sc2 = new Scanner(System.in);
                            num = sc2.nextInt();
                            queue.addQueue(num);
                            flga = false;
                        } catch (Exception e) {
                        if (e instanceof InputMismatchException){
                                System.out.print("输入数字格式有误,");
                            } else {
                                System.out.println(e.getMessage());
                                flga = false;
                            }
                        }
                    }
                    break;
                case 'g':
                    try {
                        int queue1 = queue.getQueue();
                        System.out.printf("取出数据是:%d\r\n",queue1);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        int i = queue.headQueue();
                        System.out.printf("头数据是:%d\r\n",i);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                default:
                    System.out.println("别瞎搞,好好输入,揍你奥!");
                    break;
            }
        }
    }
}

class ArrayQueueTest {
    //1.一个队列会有几个属性 -- 队列的最大长度,队列头=队列中第一条数据的位置-1,队列尾=队列中最后一条数据的位置,初始的数组
    private int maxSize;
    private int front;
    private int rear;
    private int[] arrQueue;
    //2.一个队列的构造方法
    public ArrayQueueTest(int maxSize){
        arrQueue = new int[maxSize];
        front = -1;
        rear = -1;
        this.maxSize = maxSize;
    }
    //4.判断队列是否满了的方法
    public Boolean isFull(){
        return rear==this.maxSize-1;
    }
    //3.向队列中添加数据的方法
    public void addQueue(int i){
        if (isFull()){
            throw new RuntimeException("队列满了,别加了~");
        }
        arrQueue[++rear] = i;
    }
    //6.判断队列中是否含有数据
    public Boolean isEmpty(){
        return rear == front;
    }
    //5.获取队列中数据的方法
    public int getQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空的,你取啥?");
        }
        return arrQueue[++front];
    }
    //6.查看头数据
    public int headQueue(){
        if (isEmpty()){
            throw new RuntimeException("队列空的,哪有头?");
        }
        return arrQueue[front+1];
    }

    //显示队列中的所有数据
    public void showQueue(){
        System.out.println("队列中的数据:"+Arrays.toString(arrQueue));
    }
}

        以上是关于队列的简单小案例,如有不严谨的地方,麻烦各位大佬评论或私信支教,还请不吝赐教,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值