数据结构与算法-数组模拟队列

简介: 数据结构与算法-数组模拟队列

队列介绍

队列是一个有序列表,可以使用数组或者链表来实现
遵循原则:先进先出

使用数组模拟队列

在这里插入图片描述

思路分析
1、rear时代表队列的尾部,front代表的队列的头部;
2、第二个图是当有数据加入时,front还是-1,rear在增加;
3、第三个图展示的时从队列取出数据的情况,front在往上移动,rear没有变化。

(1)队列本身是有序列表
(2)当front = rear队列为空
(3)当添加数据的时候rear+1

 但是我们的rear<Max

Size-1【队列有空余】,数组的下标是从0开始的。

代码实现:

做一个程序来模拟数组的增加数据,取出数据

import java.util.Scanner;

public class ArrayQueueDemo {
    public static void main(String[] args) {
        ArrayQueue arrayQueue = 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("g(get): 从队列取出数据");
            System.out.println("a(add): 向队列插入数据");
            System.out.println("h(head): 显示队列头");
            key = scanner.next().charAt(0);

            switch (key){
                case 's':
                    arrayQueue.showArray();
                    break;
                case 'a':
                    System.out.println("输入一个数字");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':
                    try {
                        int getValue = arrayQueue.getQueue();
                        System.out.println(getValue);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'h':
                    try {
                        System.out.println("查看队列头的信息");
                        int headValue = arrayQueue.headQueue();
                        System.out.printf("队列头的信息为:%d\n",headValue);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case 'e':
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");

    }
}

class ArrayQueue{
    private int maxsize;
    private int front;
    private int rear;
    private int[] arr;
    //创建队列的构造器
    public ArrayQueue(int arrMaxsize){
        maxsize = arrMaxsize;
        arr = new int[arrMaxsize];
        front = -1; //指向队列头部
        rear = -1;
    }

    public boolean isFull(){
        return rear == maxsize-1;
    }

    public boolean isEmpty(){
        return front == rear;
    }

    public void addQueue(int n){
        if(isFull()){
            System.out.println("队列已经满了");
            return;
        }
        rear++;
        arr[rear] = n;
    }

    public int getQueue(){
        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 headQueue(){
        if(isEmpty()){
            throw new RuntimeException("队列空");
        }
        return arr[front + 1];
    }
}

我们可以看出这里的数组模拟队列是有问题的,当我们把所有的数字取完之后,想要再次插入数据,发现已经无法插入数据了,因为我们的队列不是环形队列。

下期预告

下一讲,我给大家讲如何用数组实现一个完整的环形队列
目录
相关文章
|
16天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
91 9
|
1月前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
30 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
1月前
初步认识栈和队列
初步认识栈和队列
59 10
|
1月前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
21 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
1月前
【数据结构】-- 栈和队列
【数据结构】-- 栈和队列
16 0
|
1月前
探索数据结构:队列的的实现与应用
探索数据结构:队列的的实现与应用
|
1月前
|
存储 C语言
栈和队列题目练习
栈和队列题目练习
16 0
|
26天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
11天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。