Java基础学习10--算法

 队列(2023-02-02)
使用数组模拟队列(未优化)
1.需要用的变量有front=-1,rear=-1,maxsize以及数组int[] arr;
2.判断队列已满的条件是rear==maxsize-1,队列为空的条件是rear==front;
3.入队是需要判断队列是否已满且rear的后移条件是为rear++,出队是需要判断队列是否为空(以抛出异常的方式提示)front++
throw new RuntimeException("队列为空");

4.队列长度为maxsize,即遍历输出队列的时候的循环终止条件是maxsize

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用数组模拟队列(优化后)
1.需要用的变量有front=0,rear=0,maxsize以及数组int[] arr;
2.判断队列已满的条件是(rear+1)%maxsize,队列为空的条件是rear==front;
3.入队是需要判断队列是否已满且rear的后移条件为(rear+1)%maxsize,出队是需要判断队列是否为空(以抛出异常的方式提示),front的后移条件是(front+1)%maxsize
throw new RuntimeException("队列为空");

4.队列长度为 (rear+Maxsize-front)%Maxsize ,即遍历输出队列的时候的循环终止条件是front+ size()

size()为函数,函数体就是(rear+Maxsize-front)%Maxsize

类:

package com.zyk.Queue;

public class Queue {
    private int Maxsize;
    private int front;
    private int rear;
     private int[] arr;

    public Queue(int maxsize) {
        Maxsize = maxsize;
        arr=new int[Maxsize];

    }
    public boolean isFull(){
        //return rear==Maxsize-1;
        return (rear+1)%Maxsize==front;//优化算法
    }
    public boolean isEmpty(){
        return front==rear;
    }
    public void AddQueue(int n){
        if(isFull()){
            System.out.println("队列已满");
            return;
        }
     // rear++;
     // arr[rear]=n;
        arr[rear]=n;
        rear=(rear+1)%Maxsize;
    }
    public int GetQueue(){
        if(isEmpty()){
          throw new RuntimeException("队列为空");
        }
      // front++;
      // return arr[front];
        int value =arr[front];
        front=(front+1)%Maxsize;
        return value;
    }
    public void ShowQueue() {
        if (isEmpty()) {
            System.out.println("队列为空");
            return;
        }
        //      for(int i=0;i<Maxsize;i++){
        //          System.out.printf(arr[i]+"\t");
        //      }
        //  }
        //循环从front开始,结束条件是队列的有效个数
        for (int i = front; i <front+ size(); i ++) {
            System.out.printf("arr[%d]=%d\n",i%Maxsize,arr[i%Maxsize]);
        }
    }
    //计算有效的队列个数
    public int size(){
        return (rear+Maxsize-front)%Maxsize;
    }
}

主函数:

package com.zyk.Queue;

import java.util.Scanner;

public class ArrayQueue {
    public static void main(String[] args) {
        //有效长度只有3,所以只能输入三个数据,输入第四个数据时会提示已满,这是因为有一个rear和front约定的空间
        Queue queue = new Queue(4);
        String key="";
        boolean loop=true;
        Scanner scanner = new Scanner(System.in);
        do {
            System.out.println("\n\t\t\t1 显示队列");
            System.out.println("\t\t\t2 入队");
            System.out.println("\t\t\t3 出队");
            System.out.println("\t\t\t4 退出系统");
            System.out.println("请输入选项");
            key=scanner.next();
            switch (key){
                case"1":
                    queue.ShowQueue();
                    break;
                case"2":
                    System.out.println("请输入数据");
                    int value=scanner.nextInt();
                    queue.AddQueue(value);
                    break;
                case"3":
                    try {
                        int res=queue.GetQueue();
                        System.out.println(res);
                    }catch(Exception e){
                        System.out.println(e.getMessage());
                    }
                    break;
                case"4":
                    scanner.close();
                    loop=false;
                    break;

            }
        }while(loop);
        System.out.println("已退出......");
    }
}

 

posted @ 2023-02-02 17:18  cojames  阅读(37)  评论(0编辑  收藏  举报