数据结构之队列

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之队列相关的知识,希望对你有一定的参考价值。

队列

队列是一个有序列表,可以用数组或者链表来实现
遵循先入先出的原则,现存人的数据要先取出;
两个变量 font,rear表示前后端
rear=-1,font=-1表示队列中0个元素

思路分析:
ii)将尾指针往后移,rear+1,当front == rear【空】
ii)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数组元素中,否则无法存入数据,rear==maxSize-1【队列满】

代码实现:

package 数据结构.队列;

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("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");
            key =scanner.next().charAt(0);

            switch (key)
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("输入一个数");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':
                    //取出数据
                    try
                        int res = arrayQueue.getQueue();
                        System.out.printf("取出的数据是%d\\n",res);
                    catch (Exception e)
                        System.out.println(e.getMessage());
                    
                    break;
                case 'h':
                    try
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据是%d\\n",res);
                    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 font;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列

    public  ArrayQueue(int maxSize)
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //初始化,这里代表0个元素
        font =-1;
        rear =-1;
    

    //判断队列是否为满
    public boolean isFull()
        return rear == maxSize-1;
    

    //判断队列是否为空
    public  boolean isEmpty()
        return rear == font;
    

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

    //获取队列的数据,出队列
    public int getQueue()
        if (isEmpty())
            throw  new RuntimeException("队列为空,不能取数据");
        
        //因为前面font为-1,所以这里需要先+1
        font++;
        return arr[font];

    

    //显示数组
    public void  showQueue()
        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("队列为空,不能取数据");
        
        //因为前面font为-1,所以这里需要先+1
        return arr[font+1];

    




环形队列
数组只用一次就不能重复使用,将这个环形数组使用算法,改成环形队列

数据的个数:(rear+maxsize-font)%maxSize这里主要是起到修正的作用,应该rear-font可能等于负数
预留一个空间,这个位置不放任何元素,作用就是为了区别队空和队满
下面环形队列代码font=0;rear=0为初始状态,即队列为0个元素

代码实现:

package 数据结构.队列;

import java.util.Scanner;

public class CircleArrayQueueDemo 
    public static void main(String[] args) 
        //最大只有三个a
        CircleArrayQueue arrayQueue = new CircleArrayQueue(4);
        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("a(add):添加数据到队列");
            System.out.println("g(get):从队列取出数据");
            System.out.println("h(head):查看队列头的数据");
            key =scanner.next().charAt(0);

            switch (key)
                case 's':
                    arrayQueue.showQueue();
                    break;
                case 'a':
                    System.out.println("输入一个数");
                    int value = scanner.nextInt();
                    arrayQueue.addQueue(value);
                    break;
                case 'g':
                    //取出数据
                    try
                        int res = arrayQueue.getQueue();
                        System.out.printf("取出的数据是%d\\n",res);
                    catch (Exception e)
                        System.out.println(e.getMessage());
                    
                    break;
                case 'h':
                    try
                        int res = arrayQueue.headQueue();
                        System.out.printf("队列头的数据是%d\\n",res);
                    catch (Exception e)
                        System.out.println(e.getMessage());
                    
                    break;
                case 'e'://退出
                    scanner.close();
                    loop =false;
                    break;
                default:
                    break;
            

        
        System.out.println("程序退出~");
    





class CircleArrayQueue
    private int maxSize;//表示最大容器
    private int font;//队列头
    private int rear;//队列尾
    private int[] arr;//存放数据,模拟队列

    public  CircleArrayQueue(int maxSize)
        this.maxSize = maxSize;
        arr = new int[maxSize];
        //初始化,这里代表0个元素
        font =0;
        rear =0;
    

    //判断队列是否为满
    public boolean isFull()
        return (rear+1)%maxSize==font;
    

    //判断队列是否为空
    public  boolean isEmpty()
        return rear == font;
    

    //添加数据队列
    public void addQueue(int n)
        if(isFull())
            System.out.println("队列已经满了");
            return;
        
        arr[rear] = n;
        //考虑环形
        rear =(rear+1)%maxSize;
    

    //获取队列的数据,出队列
    public int getQueue()
        if (isEmpty())
            throw  new RuntimeException("队列为空,不能取数据");
        
        //1.先把font对应的值保存到一个临时变量
        //2.有font后移,考虑取模
        //3.将临时变量返回
        int value = arr[font];
        font = (font+1)%maxSize;
        return value;


    

    //显示数组
    public void  showQueue()
        if (isEmpty())
            System.out.println("队列为空,不能取数据");
            return;
        
        for (int i=font;i<(font+size());i++)
            System.out.printf("arr[%d]=%d\\n",i%maxSize,arr[i%maxSize]);
        
    

    //显示队列头部
    public int headQueue()
        if (isEmpty())
            throw  new RuntimeException("队列为空,不能取数据");
        
        //因为前面font为-1,所以这里需要先+1
        return arr[font];

    

    //取出有效数据个数
    public  int size()
        return (rear+maxSize-font)%maxSize;
    




以上是关于数据结构之队列的主要内容,如果未能解决你的问题,请参考以下文章

数据结构_线性机构(队列)

线性表栈和队列

GET-----POST

前端面试题--HTTP

web——前后端通信原理

C语言试题四十三之求出ss所指字符串中指定字符的个数,并返回此值。