使用数组模拟普通队列-------缺点是每个数组下标只能使用一次

思路如下:

  1. front:指向队列头的前一个位置,front的初始值是-1;
  2. rear:rear指向队列最后一个元素,rear的初始值是-1;
  3. 当队列满时,条件是rear==maxSize-1;
  4. 当队列为空时,条件是rear==front;5
  5. 添加一个数据到队列时,主要分为以下几个步骤:①判断队列是否已满               ②rear指向下一个位置:rear++;        ③arr[rear]=n;
  6. 数据出队列,主要分为以下几个步骤:①判断队列是否为空     ②front指向下一个位置:front++;     ③ return arr[front];
  7. package com.atguigu.quque;
    
    import java.util.Scanner;
    
    public class ArrayQueue {
    	public static void main(String[] args) {
    		ArrayToQueue arrayqueue=new ArrayToQueue(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 n=scanner.nextInt();
    				arrayqueue.addQueue(n);
    				break;
    			case 'g':
    				try {
    					int res=arrayqueue.getQueue();
    					System.out.println("取出的数据是:"+res);
    				} catch (Exception e) {
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'h':
    				try {
    					int res=arrayqueue.headQueue();
    					System.out.println("数据头是:"+res);
    				} catch (Exception e) {
    					System.out.println(e.getMessage());
    				}
    				break;
    			case 'e':
    				scanner.close();
    				loop=false;
    				break;
    			default:
    				break;
    			}
    		}
    		System.out.println("程序退出");
    	}
    }
    
    //使用数组模拟队列
    class ArrayToQueue{
    	private int maxSize;//数组最大容量
    	private int front;//队列头
    	private int rear;//队列尾
    	
    	private int[] arr;//该数组用于存放数据,模拟队列
    	
    	//创建队列的构造器
    	public ArrayToQueue(int arrMaxSize) {
    		maxSize=arrMaxSize;
    		arr=new int[maxSize];
    		front=-1;//指向队列头的前一个位置
    		rear=-1;//指向队列尾的具体数据,即就是队列的最后一个数据
    	}
    	
    	//判断队列是否满
    	public boolean isFull() {
    		return rear==maxSize-1;
    	}
    	
    	//判断队列是否为空
    	public boolean isEmpty() {
    		return rear==front;
    	}
    	
    	//添加数据到队列
    	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 showQueue() {
    		if(isEmpty()) {
    			System.out.println("队列为空,没数据");
    			return;
    		}
    		for(int n:arr) {
    			System.out.println(n);
    		}
    	}
    	
    	//显示队列头数据
    	public int headQueue() {
    		if(isEmpty()) {
    			throw new RuntimeException("队列为空,没数据");
    		}
    		return arr[front+1];
    	}
    }
    

     

你可能感兴趣的:(数据结构与算法)